【发布时间】:2014-07-05 11:05:52
【问题描述】:
我有一个托管多个 WPF 控件的 Windows 窗体程序。它是一个测试执行工具。我们遇到了 Invoke 调用永远不会返回的问题。我们的一位用户编写的其中一项测试计划正在发生这种情况。
问题发生在整个程序的不同调用处。两个例子:
winForm.Invoke(new Action(() => wpfControl.DataContext = something));
Application.Current.Dispatcher.Invoke(new Action(() => result.Container.Clear()));
调用 Invoke 的线程永远不会从 Invoke 返回。我预计 GUI 线程会出现死锁,但 GUI 线程执行得很好。 有趣的是,所有 WinForm 控件都正常运行,但没有 WPF 控件响应用户。 似乎没有其他工作线程被阻塞。
想到两个问题:
- 有人有调试建议吗?
- 为什么会阻止所有 WPF 控件但所有 WinForm 控件都可以正常工作?
编辑: 我应该提到这可能是某种竞争条件。它很少出现,只有在应用程序正常工作一段时间后才会出现。
【问题讨论】:
-
我不知道到底发生了什么,但是你在这里的信息太少了。您应该获得 dotpeek 或反射器,并在 WPF 内部“循环”中放置一个断点,并查看它为什么不更新/为什么不调用它。调试中最强大的技术是实际调试内部代码。如果您使用
Snoop工具,我也很想看看会发生什么。 -
你怎么说所有的 WinForm 控件都表现正常?在您的代码中,如果
winForm.Invoke没有返回到下一行,则整个应用程序不应响应。 -
设置
DataContext应该在与创建 WPF 控件的线程相同的线程中完成,您确定是这种情况吗?也可以试试BeginInvoke -
你确定 WPF Dispatcher 已经启动了吗?
-
@ChrisEelmaa 您对调试的建议正是我下一步要寻找的。我以前没有调试过内部代码。下次我可以看看这个问题时,我会尝试。它每隔几千小时的应用程序运行时间才会发生一次。如果您将编辑作为答案,我会为其分配赏金。
标签: c# .net wpf multithreading winforms