如何运行多个线程并等待它们全部完成

4

我想编写一个方法,可以运行多个线程,并且在方法结束之前,使用 async/await 确保它们全部完成。我该如何实现?

请考虑以下伪代码:

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   
}

我该如何做到这一点?
3个回答

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);
}

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
Task.WaitAll() 是一个 params 方法,因此您可以简单地调用它,如 Task.WaitAll(a, b, c, d) - svick

-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 { }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接