using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Threading; namespace Tango.FirmwareUpdateLib.WPF { public class ProgressDispatcher { private Dispatcher _dispatcher; private Window _dummyWindow; //Dummy window for the video dispatcher. private Thread _windowThread; //The video dispatcher thread. private bool _initialized; public void Initialize() { if (!_initialized) { _windowThread = new Thread(VideoThreadMethod); _windowThread.Name = "Progress Thread"; _windowThread.SetApartmentState(ApartmentState.STA); _windowThread.Start(); while (!_initialized) { Thread.Sleep(10); } } } private void VideoThreadMethod() { _dummyWindow = new Window(); _dummyWindow.Width = 0; _dummyWindow.Height = 0; _dummyWindow.WindowStyle = WindowStyle.None; _dummyWindow.ShowInTaskbar = false; _dummyWindow.ShowActivated = false; _dummyWindow.ResizeMode = ResizeMode.NoResize; _dummyWindow.Visibility = Visibility.Hidden; _dummyWindow.Opacity = 0; _dummyWindow.Closed += (x, y) => _dummyWindow.Dispatcher.InvokeShutdown(); _dummyWindow.Loaded += (x, y) => { _dummyWindow.Width = 0; _dummyWindow.Height = 0; _dummyWindow.WindowStyle = WindowStyle.None; _dummyWindow.ShowInTaskbar = false; _dummyWindow.ShowActivated = false; _dummyWindow.ResizeMode = ResizeMode.NoResize; _dummyWindow.Visibility = Visibility.Hidden; _dummyWindow.Opacity = 0; _dispatcher = _dummyWindow.Dispatcher; _initialized = true; }; Debug.WriteLine("Progress Dispatcher Initialized!"); _dummyWindow.Show(); Dispatcher.Run(); } public void Invoke(Action action) { _dispatcher.BeginInvoke(action); } public void Close() { _dispatcher.InvokeShutdown(); } } }