等待任务完成

时间:2017-07-31 13:33:09

标签: c# async-await

我有2个简单的方法,我希望进程在完成之前不会继续。因此,我使用await Task.WaitAll(tasks); 但是编译器在这行中给出了错误:

Severity    Code    Description Project File    Line    Suppression State
Error   CS1503  Argument 1: cannot convert from ' 
'System.Collections.Generic.List<System.Threading.Tasks.Task>' to 
'System.Threading.Tasks.Task'   

我为什么要自己手动转换?我以为这会由编译器来完成......

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

internal class Program
{
    public static void Count1()
    {
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("Count 1 " + i);
            Thread.Sleep(100);
        }
    }

    public static void Count2()
    {
        for (int i = 0; i < 20; i++)
        {
            Console.WriteLine("Count 2 " + i);
            Thread.Sleep(100);
        }
    }

    public static async Task Run()
    {
        List<Task> tasks = new List<Task>();

        Task t1 = Task.Run(()=>Count1());
        Task t2 = Task.Run(() => Count2());

        tasks.Add(t1);
        tasks.Add(t2);

        await Task.WaitAll(tasks);  //ERROR IS THROWN HERE
    }

    private static void Main(string[] args)
    {
        Run();

        Console.ReadKey();
    }
}

2 个答案:

答案 0 :(得分:16)

我怀疑你的意思是WhenAll而不是WaitAllWaitAll阻止调用,在原始任务完成后同步返回所有结果。你无法等待结果,因为它不是一项任务。

WhenAll是一个异步调用,它返回一个任务,该任务在所有原始任务完成后完成。你可以等待。

如果您将Run方法的结尾更改为:

await Task.WhenAll(tasks);
Console.WriteLine("All tasks completed");

...您将看到任务完成,然后是完成消息。

答案 1 :(得分:1)

您可以将其用作:

Task.WaitAll(tasks.ToArray());
  • 需要任务的参数,因此你必须使用linQ的toArray()。
  • 或者您也可以使用:Task.WhenAll(t1, t2);作为@Jon Skeet建议。
  

Task.WaitAll和Task.WhenAll之间的主要区别在于   前者将阻止(类似于在单个任务上使用Wait)   后者不会也可以等待,让控制回到了   调用者直到所有任务完成。

     

详细信息:You Can see here