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()导致在WPF应用程序中处理窗口消息

众所周知,Thread.Join发送的消息比WaitHandle.WaitOne通常发送的消息多。

代替:

_thread.Join();

试试这个:

Task.Run(() => _thread.Join()).Wait();

这将把_thread.Join()从UI线程移动到ThreadPool线程,在那里没有什么可泵送的。它应该防止在UI线程上泵送。

也可以使用超时:

Task.Run(() => _thread.Join(timeout)).Wait();