完全重写了这个问题,因为我现在有了更多关于正在发生的事情的信息。
我有一个自定义的customtracelistener,它重写writeline方法,将字符串添加到自定义的可观察集合中。此集合类将所有通知事件调度到UI线程,以允许其他线程对其进行更新,同时仍允许WPF数据绑定。
我有一个包含列表框的用户控件。listbox将跟踪侦听器中的可观察集合绑定到它的itemssource。
在应用程序启动时,我设置了windows/usercontrol/viewmodel,并显示了窗口。然后,我启动一个工作线程,该线程运行应用程序所需的一些后端进程。如果后台线程在UI线程完成所有用户控件设置和数据绑定之前执行Trace.WriteLine,我的应用程序就会死锁。
通过在UI线程中添加睡眠和其他随机长时间运行的任务和/或延迟启动工作线程以使UI线程有时间完成,我已经在某种程度上合理地证明了这种竞争条件。
我现在考虑实现的解决方案是创建一个AppSetupCompleted方法,该方法启动所有后端进程的工作线程,并将其发送到具有后台优先级的Dispatcher。从理论上讲,这是否应该延迟工作线程,直到成功设置WPF控件和视图模型的所有绑定?
发布于 2011-05-25 16:27:15
听起来像是死锁或活锁...假设死锁(应用程序冻结时cpu较低),将调试器附加到应用程序并中断它。查看线程(UI和您从中调用Trace.WriteLine的那个)的调用堆栈,以了解它们被锁定的位置。
如果您不知道这是阻塞,请在您的问题中添加调用堆栈,它可能会帮助我们回答您的问题。
https://stackoverflow.com/questions/6119978
复制相似问题