2010-05-18 78 views
2

假設我有方法 void SomeMethod(動作回調) 此方法在後臺線程中執行一些工作,然後調用回調。問題是 - 如何阻止當前線程直到回調被調用?.NET線程:如何等待其他線程完成一些任務

有一個例子

bool finished = false; 
SomeMethod(delegate{ 
finished = true; 
}); 
while(!finished) 
    Thread.Sleep(); 

但我敢肯定應該有更好的方式

+0

如果你想阻止當前線程,直到在後臺線程的工作完成後,可能你只是做了當前線程,而不是在工作? – 2010-05-18 05:32:27

+0

不,不幸的是,我不能在當前線程中完成這項工作。 – 2010-05-18 05:35:19

+0

您是否考慮過在線程內部等待或使用回調/事件之後放置代碼?你所描述的是一個同步操作。有沒有更多的信息? – 2010-05-25 03:20:44

回答

3

可以使用的AutoResetEvent時信號你的線程完成了。

檢查這個代碼片段:

AutoResetEvent terminateEvent = new AutoResetEvent(false); 
    bool finished = false; 
    SomeMethod(delegate 
    { 
     terminateEvent.Set(); 
    }); 
    terminateEvent.WaitOne(); 
+0

謝謝,它確實有效。它比線程睡眠更快嗎? – 2010-05-18 05:32:35

+0

當阻塞時間非常短時,自旋鎖定(不斷檢查while循環中的標誌,可能帶有'Thread.Sleep')可能會更快,否則,「AutoResetEvent」是要走的路。 – 2010-05-18 05:37:15

1

檢查Thread.Join()將工作

Example of this

+0

Thread.Join的問題在於其他線程在調用回調時沒有完成。 – 2010-05-18 05:23:10