当孩子执行了某个动作时通知父线程[C#]

时间:2009-08-28 15:59:47

标签: c# multithreading

我有一个父线程(非UI)创建一些子线程来做一些工作 - 在某些时候,父线程必须等待子线程完成某些任务 - 这并不意味着孩子已经完成但是只是它已达到某一点,父母现在可以继续处理......

为了说明请参考下面的代码,显然这不是我的孩子所做的,但它显示了我想要完成的事情。回想一下,这些都不是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 ...
}

任何人都有关于如何以线程安全的方式完成此任务的任何建议? 任何帮助将非常感激。 谢谢,

3 个答案:

答案 0 :(得分:1)

您可以使用WaitHandle执行此操作(我会添加常用的代码示例,但MSDN中提供的示例几乎完全符合您的要求)

答案 1 :(得分: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();
}

答案 2 :(得分:0)

您是否有使用显式线程而不是BackgroundWorker的原因? BackgroundWorker具有内置工具,用于将进度传回UI线程。