0

我对 WaitHandle.WaitAll 的工作有疑问,希望能提供任何帮助。

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

我使用 WaitHandle.WaitAll 并希望继续使用这种方法。(没有线程。加入等,请:))

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(events) 之前。因为打开新子线程的循环有一些长时间的超时。

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

4

2 回答 2

6

It does not matter. The wait returns when all events are signaled (set) - whether or not that happened before or after wait was called.

于 2013-01-22T18:37:53.953 回答
3

As it was said, it does not matter, however, you should consider using the Task class for that kind of things.

It also allows you to run your tasks either simultaneously or consequentially.

Your code then will be only this:

Task.WaitAll(
    Task.Factory.StartNew(() =>
    {
        Thread.Sleep(1000);
    }),
    Task.Factory.StartNew(() => { Thread.Sleep(1000); }),
    Task.Factory.StartNew(() => { Thread.Sleep(1000); })
    );
于 2013-01-22T18:45:22.100 回答