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

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

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

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

通常情况下,如果我的应用程序在某些操作的中间挂起,我会去按Visual Studio的暂停,并在debugging器中看到线程视图。 这给了我足够的想法,哪个呼叫是罪魁祸首。

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

任何人都面临/意识到类似的问题,我怎么可以继续debugging呢?

Solutions Collecting From Web of "WPF主应用程序停止响应,如果一个子窗口正在移动"

尝试使用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 } 

只要在你的定时器tick事件中包装,一切都应该按需要运行。

问题是你使用一个单一的线程。 您需要将工作转移到另一个线程。 即:ThreadPool.QueueUserWorkItem或使用较新的任务模型,或Dispatcher.Invoke …

只要确保你将任何UI编组回到UI线程,当你完成或它将GPF在你身上。