2009-08-28 36 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