自定义跟踪侦听器冻结WPF应用程序中的GUI
本文关键字:GUI 应用程序 WPF 跟踪 侦听器 冻结 自定义 | 更新日期: 2023-09-27 17:57:47
完全重写了这个问题,因为我现在有了更多关于正在发生的事情的信息。
我有一个customtracestener,它重写writeline方法,将字符串添加到自定义observaleCollection中。这个集合类将所有通知事件分派到UI线程,以允许其他线程更新它,并且仍然允许WPF数据绑定。
我有一个用户控件,其中包括一个列表框。listbox将跟踪侦听器中的observablecollection绑定到它的itemsource。
在应用程序启动过程中,我设置了windows/usercontrols/viewmodels,并显示了窗口。然后,我启动了一个工作线程,该线程运行应用程序所需的一些后端进程。如果后台线程在UI线程完成所有用户控件设置和数据绑定之前执行Trace.WriteLine,那么我的应用程序就会死锁。
我已经能够通过在UI线程中添加睡眠和其他随机长时间运行的任务和/或延迟启动工作线程以给UI线程时间来完成,在某种程度上合理地证明了这种竞争条件。
我现在想实现的解决方案是创建一个AppSetupCompleted
方法,该方法启动所有后端进程的工作线程,并将其发送给具有后台优先级的Dispatcher。理论上,这是否应该延迟工作线程,直到成功设置了WPF控件和视图模型的所有绑定?
对我来说听起来像是死锁或活锁…假设死锁(应用程序冻结时cpu较低),将调试器附加到应用程序并打破它。查看线程的调用堆栈(UI和从中调用Trace.WriteLine的线程),看看它们锁定在哪里。
如果您无法确定是阻塞,请将调用堆栈添加到您的问题中,这可能有助于我们回答您的问题。