WaitHandle.WaitAll和ManualResetEvent.Set() - 首先应该是什么?

时间:2013-01-22 18:34:37

标签: c# .net multithreading

我对WaitHandle.WaitAll的工作有疑问,非常感谢。

让我们假设我有这样的情况:父线程正在打开几个子线程,并且必须等待“做其他事情”,直到子线程完成他们的工作。

我使用WaitHandle.WaitAll并希望继续使用此方法。 (没有Thread.Join等,请:))

ManualResetEvent[] events = new ManualResetEvent[list.Count];

foreach (string row in list)
{
    events[i] = new ManualResetEvent(false);                

    Thread thread = new Thread(new ParameterizedThreadStart(DoSomething));
    thread.Start(events[i]); // start child thread

    System.Threading.Thread.Sleep(1000000);

    i++;
}

WaitHandle.WaitAll(events); // wait for child threads finish their work
...
...


private DoSomething(object sth)
{
// some stuff that executes only 1 second
ManualResetEvent.Set()
}

第一个新启动的子线程的情况是,调用ManualResetEvent.Set()是在父线程中调用WaitHandle.WaitAll(事件)之前。因为打开新子线程的循环有一些长时间超时。

所以我的问题,不会是这样的时间问题吗? 调用ManualResetEvent.Set()之前不应该是WaitHandle.WaitAll吗?

2 个答案:

答案 0 :(得分:5)

没关系。当所有事件都发出信号(设置)时,等待返回 - 无论是在调用等待之前还是之后发生的。

答案 1 :(得分:3)

正如所说的那样,无所谓,你应该考虑使用Task类来做这类事情。

它还允许您同时或相应地运行任务。

您的代码只会是这样:

Task.WaitAll(
    Task.Factory.StartNew(() =>
    {
        Thread.Sleep(1000);
    }),
    Task.Factory.StartNew(() => { Thread.Sleep(1000); }),
    Task.Factory.StartNew(() => { Thread.Sleep(1000); })
    );