我遇到了問題,對此我無法找到解決方案。問題如下: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調用 –
順便說一下,該庫的名稱是什麼?只是爲了確保我永遠不會使用它;) –