我遇到了问题,对此我无法找到解决方案。问题如下:Dispatcher.Invoke在主线程调用Thread.Join时挂起
在主线程(默认线程)中,我启动了一个线程,然后立即在主线程中,通过调用产生的线程上的Thread.Join
来等待线程的退出。当我这样做,如果产生的线程通过调用Dispatcher.Invoke
尝试在主线程的上下文中回调,它会挂起。任何想法我可以允许回调?
回调函数具有指示线程退出的逻辑。如果不执行回调,线程将永远不会退出,所以主线程也会停滞。
我遇到了问题,对此我无法找到解决方案。问题如下:Dispatcher.Invoke在主线程调用Thread.Join时挂起
在主线程(默认线程)中,我启动了一个线程,然后立即在主线程中,通过调用产生的线程上的Thread.Join
来等待线程的退出。当我这样做,如果产生的线程通过调用Dispatcher.Invoke
尝试在主线程的上下文中回调,它会挂起。任何想法我可以允许回调?
回调函数具有指示线程退出的逻辑。如果不执行回调,线程将永远不会退出,所以主线程也会停滞。
如果您只是等待它完成,那么开始一个新线程有什么意义?只是做我不完全相信你问什么,但你可以尝试,而不是调用
终止,你可以简单地轮询循环,就像这样:
// var otherThread = ...;
volatile bool terminate = false;
while (!terminate)
{
Thread.Sleep(100);
}
otherThread.Join();
然后,把它留给回调设置终止标志为true,一旦你准备加入。
当我试过至少发布begininvoke的线程是响应式的但hte调用永远不会成功,因为主线程处于thread.join状态。 – murlex
的BeginInvoke如果你只打算要在线程等待主线程的工作...
工作。但是必须在while循环中添加Application.Doevents,以便在使用dispatcher.invoke时执行回调。不喜欢解决方案,但至少它的作品! – murlex
我有一个类似的问题,我终于以这种方式解决:
do{
// Force the dispatcher to run the queued operations
Dispatcher.CurrentDispatcher.Invoke(delegate { }, DispatcherPriority.ContextIdle);
}while(!otherthread.Join(1));
这将产生一个加入不会因为其他线程GUI的操作的阻塞。
这里的主要技巧是阻止Invoke
具有空委托(无操作),但优先级设置小于队列中的所有其他项。这迫使调度员在整个队列中工作。 (默认优先级为DispatcherPriority.Normal = 9
,所以我的DispatcherPriority.ContextIdle = 3
已完好。)
Join()调用使用1 ms超时,并且只要联接不成功就重新清空调度程序队列。
不幸的是,它是一个第三方库,它会产生一个线程,并在事件处理程序通过Dispatcher.invoke通知我们事件处理程序。我们使用该事件处理程序来停止线程 – murlex
然后,您不能使用Thread.Join,因为它阻塞了主线程,因此它将无法响应处理Invoke调用 –
顺便说一下,该库的名称是什么?只是为了确保我永远不会使用它;) –