我遇到了问题,我无法找到解决方法。问题如下:
在主线程(默认线程)中,我正在启动一个线程然后立即在主线程中,我通过在生成的线程上调用Thread.Join
来等待线程的退出。当我这样做时,如果生成的线程通过调用Dispatcher.Invoke
尝试在主线程的上下文中回调,它就会挂起。我有什么想法可以允许回调吗?
回调具有指示线程退出的逻辑。在不执行回调的情况下,线程永远不会退出,因此主线程也会卡住。
答案 0 :(得分:0)
如果你等待它完成,开始新线程有什么意义?只需在主线程上完成工作......
答案 1 :(得分:-1)
我不确定你在问什么,但你可以尝试使用BeginInvoke而不是Invoke
答案 2 :(得分:-1)
如果您只是要等待线程终止,您可以简单地进行轮询循环,如下所示:
// var otherThread = ...;
volatile bool terminate = false;
while (!terminate)
{
Thread.Sleep(100);
}
otherThread.Join();
然后,在准备加入后,将其留给回调以将terminate标志设置为true。
答案 3 :(得分:-1)
我遇到了类似的问题,我最终以这种方式解决了这个问题:
do{
// Force the dispatcher to run the queued operations
Dispatcher.CurrentDispatcher.Invoke(delegate { }, DispatcherPriority.ContextIdle);
}while(!otherthread.Join(1));
这会产生一个不会因为其他线程上的GUI操作而阻塞的Join。
这里的主要技巧是使用空委托阻止Invoke
(无操作),但优先级设置小于队列中的所有其他项。这迫使调度员在整个队列中工作。 (默认优先级为DispatcherPriority.Normal = 9
,因此我的DispatcherPriority.ContextIdle = 3
完全不在。)
Join()调用使用1 ms超时,只要连接不成功,就会重新清空调度程序队列。