我想编写一个运行多个线程的方法,我希望在我的方法结束之前,我确信所有这些线程都使用async/await
完成。我怎么能这样做?
请考虑这个psudo代码:
private async void SomeWork()
{
var a = doWork1();
var b = doWork2();
var c = doWork3();
var d = doWork4();
...
//I want to assure that all of above thread are complete using `C#-5` new features
}
我怎么能这样做?
答案 0 :(得分:8)
执行此操作的async
方法是让您的方法返回Task
,然后该方法的调用者将await
(或Wait()
)。您的方法可能如下所示:
private async Task SomeWork()
{
var a = doWork1();
var b = doWork2();
var c = doWork3();
var d = doWork4();
...
await Task.WhenAll(a, b, c, d);
}
答案 1 :(得分:7)
您的要求与您的代码示例不符:您标记了方法async
,这意味着您希望此方法能够在完成其工作之前返回。然而,你说你希望它在完成所有工作后只返回。
因此,如果您希望您的方法是同步,请不要使用async
并手动等待所有任务完成:
private void SomeWork()
{
var a = doWork1();
var b = doWork2();
var c = doWork3();
var d = doWork4();
...
a.Wait();
b.Wait();
c.Wait();
d.Wait();
}
或更优雅:
Task.WaitAll(a, b, c, d);
答案 2 :(得分:-1)
private void ExecuteManyTasks(int how_many)
{
var tasks = new List<Task>();
for (var i = 0; i < how_many; i++)
{
tasks.Add(Task.Run(() =>
{
// Do your stuff here
Thread.Sleep(1000);
}));
}
// Wait for all to finish
Task t = Task.WhenAll(tasks);
try
{
t.Wait();
}
catch { }
}