2009-08-28 44 views
1

我有一個父線程(非UI),它創建一些子線程來做一些工作 - 在某些時候父母必須等待某些任務完成孩子的線程 - 這並不意味着孩子已完成,但只是它已達到一定的點,父母現在可以繼續處理...當孩子執​​行某個動作時通知父線程[C#]

說明請參考下面的代碼,顯然這不是什麼我的孩子會做,但它顯示了我正在努力完成的事情。回想一下,這些都不是UI線程...

// Parent Thread 
Thread childThread = new Thread(new ThreadStart(Manage)); 
childThread.IsBackground = true; 
childThread.Name = "NamedPipe Manager"; 
childThread.Start(); 

while (true) 
{ 
... do some work ... 

// wait for signal from MainThread to proceed // 

... do more work 
} 


// Child Thread 
private void Manage() 
{ 
... do some work ... 
... call some functions ... 

// SIGNAL TO PARENT THAT IT CAN CONTINUE // 

... do more work ... 
... call more functions ... 
} 

任何一個有我如何能做到在一個線程安全的方式這個任務有什麼建議? 任何幫助將不勝感激。 謝謝,

回答

1

如果有一個子線程,你可以使用ManualResetEvent

var signal = new ManualResetEvent(false); 

// child thread: signal to parent that it can continue 
signal.Set(); 

// parent thread: wait for signal from child thread to proceed 
signal.WaitOne(); 

如果有一個以上的孩子線程可以使用Semaphore

var semaphore = new Semaphore(0, numberOfChildThreads); 

// child thread: signal to parent that it can continue 
semaphore.Release(); 

// parent thread: wait for signal from each child thread to proceed 
for (int i = 0; i < numberOfChildThreads; i++) 
{ 
    semaphore.WaitOne(); 
} 
+0

如果它們在另一個類中會發生什麼?例如Pareant創建A = new A();而在A裏面,我們啓動一個需要在父級中設置()ManualResetEvent()的線程? – Shaitan00 2009-08-28 16:34:50

+0

將信號引用作爲參數傳遞給A構造函數 – dtb 2009-08-28 17:57:14

1

這可以使用做一個WaitHandle(我想補充平時的代碼示例,但在MSDN給出的例子是幾乎正是你想要的)

+0

認真嗎?你可以讓自動事件靜態?我以爲我需要創建AutoEvent,並以某種方式將其傳遞給子線程...但是,這是更容易,然後我認爲... 它是線程安全的?即使我有多個孩子? (只需要一個信號) – Shaitan00 2009-08-28 16:20:56

+0

是的,是的,它可以是靜態的,是的,它是線程安全的,是的,父線程將移過WaitOne()調用,直到任何其他線程設置WaitHandle。您可以使用多個WaitHandles和WaitAll調用來等待所有子線程調用Set() – 2009-08-28 16:33:38

0

您有使用顯式線程而不是BackgroundWorker的原因嗎? BackgroundWorker內置了用於將進度傳遞迴UI線程的工具。

+0

沒有UI線程......這實際上是一個Service。 你還建議使用BackgroundWorkers嗎? – Shaitan00 2009-08-28 16:31:15

+0

嗯。不知道;我從來沒有嘗試過,而且我對它的實現還不太瞭解,所以我不能說。所以其他答案可能是更好的選擇。 – 2009-08-28 17:19:22