WPF应用程序线程使用率上升和下降

时间:2010-11-21 05:58:40

标签: wpf multithreading

2 个答案:

答案 0 :(得分:1)

是的,看起来像你不应该忽视的东西。它们是Timer类用于进行回调的线程池线程。它们处于死锁状态,看起来它们正在等待由COM编组完成的方法调用。程序中应该有另一个线程,其中一个是您创建GIS对象的线程之一。该线程不会引发消息循环,这是对创建单个单元螺纹COM组件的STA线程的硬性要求。或者它自身陷入困境,而不是重新进入消息循环。获取托管堆栈跟踪应该可以更容易地查看线程被卡住的位置。

尝试在明确不支持它们的COM对象上使用线程(很少这样做)是没有意义的。确保在程序的主UI线程上创建GIS对象。并使用DispatcherTimer。当GIS组件在用户界面上受到太大影响时,创建自己的STA线程可以提供消息循环。

答案 1 :(得分:0)

问题不是与地理信息系统相关,而是由于System.Threading.Timer回调排队,因为它们被调用的速度超过了它们可以被操作的速度。问题更加复杂的是,计时器回调正在对主用户界面线程执行Dispatcher.Invoke以刷新数据网格。当主用户界面忙时,Dispatcher.Invoke被阻止,例如当用户在地图上平移和缩放时,并且在计时器回调有机会完成之前,它再次被调用。

通过在开始执行回叫时暂时停止计时器并在回叫完成后再次重新启动计时器来解决问题。此外,我没有使用Dispatcher.Invoke更新我的网格,而是将其更改为Dispatcher.BeginInvoke以避免阻塞。