如何运行多个线程并等待完成所有这些线程

时间:2012-03-26 10:17:06

标签: c# multithreading async-ctp c#-5.0

我想编写一个运行多个线程的方法,我希望在我的方法结束之前,我确信所有这些线程都使用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   
}

我怎么能这样做?

3 个答案:

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