2010-01-10 50 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超時,並且只要聯接不成功就重新清空調度程序隊列。

相關問題