public void Run() { var oldContext = SynchronizationContext.Current; SynchronizationContext.SetSynchronizationContext(m_synchronizationContext); try { m_logic.Start(); var message = new WinApi.Message(); m_display.Show(); m_stopwatch.Start(); while (WinApi.GetMessage(ref message, IntPtr.Zero, 0, 0)) { if (message.id == WinApi.WM_USER) { m_synchronizationContext.ExecuteAction(); } else { WinApi.TranslateMessage(ref message); WinApi.DispatchMessage(ref message); } } m_display.Hide(); m_logic.Stop(); } finally { SynchronizationContext.SetSynchronizationContext(oldContext); } }