【发布时间】:2015-09-23 19:51:19
【问题描述】:
关于如何等待线程退出的例子有很多,但有时我需要等到几个线程“准备好”或达到某个里程碑。
阅读后: What's the proper way to wait for a .NET thread to start up?
和 http://www.albahari.com/threading/
如果我理解正确:
等待一个子任务准备就绪:
//Main Method
var wh = new AutoResetEvent(false);
Task childTask = Task.Run(() => ChildTask(wh);
wh.WaitOne();
//Child
private void ChildTask(Barrier barrier){
//do what is needed to be done before main thread continues...
wh.Set();
}
等待几个孩子准备好:
//Main Method
var barrier = new Barrier(N+1);
Task childTask = Task.Run(() => ChildTask1(barrier);
Task childTask = Task.Run(() => ChildTask2(barrier);
...
Task childTask = Task.Run(() => ChildTaskN(barrier);
barrier.SignalAndWait(); //When all childs signal "ready" i will continue
OnMyEvent(); //for example, trigger an event
//Every Child
private void Child_i(Barrier barrier){
mainTask.MyEvent += MyEventHandler; //complete subscription before going any further
//do what is needed to be done before main thread continues...
barrier.SignalAndWait();
}
(请随意添加或建议其他好的模式)
所以我的问题是: 是否可以使用 async/await 模式来实现相同的效果?
使用这种新模式有什么优点/缺点吗?
【问题讨论】:
-
await Task.WhenAll(tasks) -
你可以使用 Stephen Toub 的
AsyncAutoResetEvent,它是为异步使用而设计的。 -
我去看看,谢谢你的建议。
标签: c# multithreading asynchronous synchronization async-await