static WindowManager() { ChatWindows = new ConcurrentBag<ChatWindow>(); GrowlWindow = new GrowlNotifications(); _uiLagWindowThread = new Thread(() => { UiLagWindow = new UiLagWindow(); _uiLagWindowDispatcher = Dispatcher.CurrentDispatcher; System.Windows.Threading.Dispatcher.Run(); }); _uiLagWindowThread.Name = "Lag Window UI Thread"; _uiLagWindowThread.SetApartmentState(ApartmentState.STA); _uiLagWindowThread.Start(); }
/// <summary> /// Must be ran on the UI thread /// </summary> public static void Shutdown() { Application.Current.MainWindow = null; try { if (UiLagWindow.IsLoaded) { UiLagWindow.RealClose(); } } catch (Exception e) { Debug.WriteLine(e); } UiLagWindow = null; _uiLagWindowDispatcher.BeginInvokeShutdown(DispatcherPriority.Normal); _uiLagWindowThread.Join(); try { if (WindowManager.DebugWindow != null) if (WindowManager.DebugWindow.IsLoaded) WindowManager.DebugWindow.Close(); } catch (Exception e) { Debug.WriteLine(e); if (Debugger.IsAttached) Debugger.Break(); } try { foreach (var w in WindowManager.ChatWindows.ToArray()) { try { if (w.IsLoaded) w.CloseDown(); w.Dispose(); } catch (Exception e) { Log.Warn("Close chat window error", e); } } WindowManager.ChatWindows = new ConcurrentBag<ChatWindow>(); } catch (Exception e) { Log.Warn("Close chat window enumerate error", e); } if (WindowManager.PlayWindow != null) if (WindowManager.PlayWindow.IsLoaded) WindowManager.PlayWindow.Close(); }