Thread.Join()导致在WPF应用程序中处理窗口消息
本文关键字:应用程序 处理 窗口 消息 WPF Join Thread | 更新日期: 2023-09-27 17:58:26
我在WPF Dispatcher机制中发现了一些奇怪的行为。让我快速解释一下应用程序:
我有一个WPF窗口,在WindowsFormsHosts中托管了几个OpenTK OpenGLControls。在OpenGLControl的OnPaint事件期间,我会渲染相应的3D场景。
在渲染过程中,我可能需要等待另一个线程完成。现在的问题是,在调用Thread.Join()的过程中,无论出于何种原因,Dispatcher都会处理其他窗口消息。这导致我的应用程序出现问题,我想禁用/阻止/了解该行为。你知道这怎么可能吗?
在我的应用程序中,这会导致意外的OpenGl上下文切换,因为在处理另一个OpenGl控件的绘制事件时,会处理不同OpenGl语境的绘制事件。
这是应用程序的调用堆栈,也许这有助于:调用堆栈http://public.virtualmischa.de/bugs/paintevent-while-join.png
谢谢
Michael
Thread.Join
发送的消息比WaitHandle.WaitOne
通常发送的消息多。
代替:
_thread.Join();
试试这个:
Task.Run(() => _thread.Join()).Wait();
这将把_thread.Join()
从UI线程移动到ThreadPool
线程,在那里没有什么可泵送的。它应该防止在UI线程上泵送。
也可以使用超时:
Task.Run(() => _thread.Join(timeout)).Wait();