当主线程调用Thread.Join时,Dispatcher.Invoke挂起

时间:2010-01-10 02:10:15

标签: c# multithreading

我遇到了问题,我无法找到解决方法。问题如下:

在主线程(默认线程)中,我正在启动一个线程然后立即在主线程中,我通过在生成的线程上调用Thread.Join来等待线程的退出。当我这样做时,如果生成的线程通过调用Dispatcher.Invoke尝试在主线程的上下文中回调,它就会挂起。我有什么想法可以允许回调吗?

回调具有指示线程退出的逻辑。在不执行回调的情况下,线程永远不会退出,因此主线程也会卡住。

4 个答案:

答案 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超时,只要连接不成功,就会重新清空调度程序队列。