2010-01-10 52 views
1

我遇到了问题,对此我无法找到解决方案。问题如下:Dispatcher.Invoke在主线程调用Thread.Join时挂起

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

回调函数具有指示线程退出的逻辑。如果不执行回调,线程将永远不会退出,所以主线程也会停滞。

回答

0

如果您只是等待它完成,那么开始一个新线程有什么意义?只是做我不完全相信你问什么,但你可以尝试,而不是调用

+0

不幸的是,它是一个第三方库,它会产生一个线程,并在事件处理程序通过Dispatcher.invoke通知我们事件处理程序。我们使用该事件处理程序来停止线程 – murlex

+0

然后,您不能使用Thread.Join,因为它阻塞了主线程,因此它将无法响应处理Invoke调用 –

+0

顺便说一下,该库的名称是什么?只是为了确保我永远不会使用它;) –

-1

终止,你可以简单地轮询循环,就像这样:

// var otherThread = ...; 
volatile bool terminate = false; 

while (!terminate) 
{ 
    Thread.Sleep(100); 
} 
otherThread.Join(); 

然后,把它留给回调设置终止标志为true,一旦你准备加入。

+0

当我试过至少发布begininvoke的线程是响应式的但hte调用永远不会成功,因为主线程处于thread.join状态。 – murlex

-1

的BeginInvoke如果你只打算要在线程等待主线程的工作...

+0

工作。但是必须在while循环中添加Application.Doevents,以便在使用dispatcher.invoke时执行回调。不喜欢解决方案,但至少它的作品! – murlex

-1

我有一个类似的问题,我终于以这种方式解决:

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

相关问题