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

当子线程执行某个操作时通知父线程[C#],c#,multithreading,C#,Multithreading,我有一个父线程(非UI),它创建一些子线程来做一些工作-在某个点上,父线程必须等待子线程完成某些任务-这并不意味着子线程已完成,而只是它已达到某个点,并且父线程现在可以继续处理 为了说明,请参考下面的代码,显然这不是我的孩子们所做的,但它显示了我正在努力实现的目标。回想一下,这些都不是UI线程 // Parent Thread Thread childThread = new Thread(new ThreadStart(Manage)); childThread.IsBackground =

我有一个父线程(非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 ...
}
有人对我如何以线程安全的方式完成这项任务有什么建议吗? 任何帮助都将不胜感激。
谢谢,

您可以使用(我会添加常用的代码示例,但MSDN中给出的示例几乎正是您想要的)

如果有单个子线程,您可以使用:

如果有多个子线程,则可以使用:

var信号量=新信号量(0,numberOfChildThreads);
//子线程:向父线程发出可以继续的信号
semaphore.Release();
//父线程:等待来自每个子线程的信号继续
for(int i=0;i
使用显式线程而不是BackgroundWorker有什么原因吗?BackgroundWorker内置了将进度反馈给UI线程的功能。

真的吗?您可以将自动事件设置为静态吗?我想我需要创建AutoEvent并以某种方式将其传递给子线程。。。但这比我想的容易多了。。。它是线程安全的吗?即使我有多个孩子?(只需要一个信号)Yes严重,Yes它可以是静态的,Yes它是线程安全的,Yes父线程将通过WaitOne()调用,直到任何其他线程设置WaitHandle。您可以使用多个WaitHandles和WaitAll调用来等待所有子线程调用Set(),因为没有UI线程。。。这实际上是一项服务。你仍然建议使用后台工作人员吗?嗯,不知道;我从未尝试过它,对它的实现也不太了解,所以我不能说。因此,其他答案中的一个可能是更好的选择。如果他们在另一个班级,会发生什么?例如,Pareant创建了一个=新的A();在A中,我们启动一个线程,该线程需要在父级中设置()ManualResetEvent(),将信号引用作为参数传递给A构造函数
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();
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();
}