2009-09-22 21 views
1

在另一個線程中等待進程完成的標準方式是什麼?等待線程完成的標準方法

在我的情況下,我有一個多線程服務,並且我想確保在服務退出之前服務停止被請求處理完成。我應該使用ManualResetEvent嗎?

+0

我認爲你的意思是像「等待線程完成的標準方法」。進程有線程,而不是其他方式。 – 2009-09-22 12:57:53

回答

2

如果您有等待完成的線程的引用,則可以在這些引用上調用.Join()方法。這將導致您的主線程等待,直到您調用.Join()的線程完成後再繼續。

或者,您可以創建主線程和子線程都可以訪問的ManualResetEvents數組。每個子線程都有一個對主線程有權訪問的數組中的一個事件的引用。在主線程結束的事件數組上調用WaitHandle.WaitAll(事件數組),並在每個子線程結束時調用.Set()函數發出主線程子線程完成信號。

主線程退出之前,下面將阻塞,直到所有子線程調用.SET()在他們的活動:

WaitHandle.WaitAll的(事件數組);

+0

請記住,WaitAll將只允許多達64個句柄等待。在服務停止事件處理程序中,您可能需要遍歷所有事件並在所有句柄上顯式調用WaitOne – 2009-09-23 03:12:10

+0

實際上將Thread.Interpt和Thread.Join – 2009-09-23 18:42:08

2

您可以保留一個List,並在服務停止時依次調用它們中的每個Thread.Join。這將等到每個人都離開。