WPF主应用程序停止响应如果正在移动子窗口

时间:2010-12-31 11:27:33

标签: c# wpf windows directx window

我们使用WPF编写了一个用C#编写的应用程序。 它有一个基于计时器的激活事件,可以在DirectX上下文中绘制一些图形。

一切似乎都很好,直到我们打开子窗口,然后在屏幕上移动它。时机似乎与计时器被解雇一致,但在那一刻,整个屏幕(甚至其他应用程序)似乎都冻结了,用户无法点击任何地方。

如果按下ALT + TAB组合键,正常操作将从冻结的完全相同的点恢复。在冻结状态下,CPU /内存利用率没有上升,这使我怀疑主线程上存在某种阻塞。

通常情况下,如果我的应用程序在某些操作过程中挂起,我会去,从Visual Studio中按暂停,然后在调试器中查看线程视图。这让我充分了解哪个电话是罪魁祸首。

但在这种情况下,如果我按ALT + TAB切换到IDE,我的应用程序将恢复正常执行。如果我将我的IDE放在辅助屏幕上并尝试单击(不需要按ALT + TAB),它似乎也被冻结(正如我之前提到的,整个桌面似乎被冻结到鼠标点击。鼠标移动然而是正常)

任何人都面临/意识到类似的问题,以及如何继续进行调试?

2 个答案:

答案 0 :(得分:1)

尝试使用BackgroundWorker进程在后台运行计时器。我遇到了完全相同的问题,我使用了BackgroundWorker并解决了我的问题。以下是一些示例代码,可帮助您入门:

BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync();
bw.Dispose();

private void bw_DoWork(object sender, DoWorkEventArgs e)
  {
     //Do Stuff Here            
     return;
  }

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  {
     //Do an action when complete
  }

只需将它包装在你的计时器刻度事件中,一切都应该根据需要发挥作用。

答案 1 :(得分:1)

问题是您使用单个线程。您需要将工作卸载到另一个线程。 ie:ThreadPool.QueueUserWorkItem或使用较新的Task模型,或Dispatcher.Invoke ...

只需确保在完成后将任何UI封送回UI线程,或者将GPF放在您身上。