在WPF应用程序中自定义tracelistener冻结GUI

时间:2011-05-25 05:38:28

标签: c# wpf multithreading tracelistener

完全重写了这个问题,因为我现在有更多关于正在发生的事情的信息。

我有一个customtracelistener,它覆盖了writeline方法,可以将字符串添加到自定义observablecollection中。此集合类将所有通知事件调度到UI线程,以允许其他线程更新它,并仍允许WPF数据绑定。

我有一个包含列表框的usercontrol。列表框将跟踪侦听器中的observablecollection绑定到它的itemssource。

在我的应用程序启动时,我设置了windows / usercontrols / viewmodels,并显示窗口。然后,我启动一个工作线程,该线程运行应用程序所需的一些后端进程。如果后台线程在UI线程完成所有用户控件设置和数据绑定之前执行了Trace.WriteLine,那么我的应用程序就会死锁。

通过在UI线程中添加睡眠和其他随机长时间运行的任务和/或延迟启动工作线程以给UI线程完成时间,我已经能够在某种程度上合理地证明这种竞争条件。

我正在考虑实现的解决方案是创建一个AppSetupCompleted方法,该方法启动所有后端进程的工作线程,并将其发送到具有后台优先级的Dispatcher。理论上,这应该延迟工作线程,直到WPF控件和视图模型的所有绑定都已成功设置?

1 个答案:

答案 0 :(得分:0)

对我来说听起来像死锁或活锁...假设死锁(当应用程序冻结时低CPU),将调试器附加到应用程序并打破它。查看线程的调用堆栈(UI和您调用的Trace.WriteLine)以查看它们的锁定位置。

如果您无法弄清楚是否阻止,请将调用堆栈添加到您的问题中,这可能有助于我们回答您的问题。