我们使用WPF编写了一个用C#编写的应用程序。 它有一个基于计时器的激活事件,可以在DirectX上下文中绘制一些图形。
一切似乎都很好,直到我们打开子窗口,然后在屏幕上移动它。时机似乎与计时器被解雇一致,但在那一刻,整个屏幕(甚至其他应用程序)似乎都冻结了,用户无法点击任何地方。
如果按下ALT + TAB组合键,正常操作将从冻结的完全相同的点恢复。在冻结状态下,CPU /内存利用率没有上升,这使我怀疑主线程上存在某种阻塞。
通常情况下,如果我的应用程序在某些操作过程中挂起,我会去,从Visual Studio中按暂停,然后在调试器中查看线程视图。这让我充分了解哪个电话是罪魁祸首。
但在这种情况下,如果我按ALT + TAB切换到IDE,我的应用程序将恢复正常执行。如果我将我的IDE放在辅助屏幕上并尝试单击(不需要按ALT + TAB),它似乎也被冻结(正如我之前提到的,整个桌面似乎被冻结到鼠标点击。鼠标移动然而是正常)
任何人都面临/意识到类似的问题,以及如何继续进行调试?
答案 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放在您身上。