无法将类型'void'隐式转换为'System.Threading.Tasks.Task'

cra*_*ice 4 .net c# task task-parallel-library async-await

这是我的代码的简化版本,下面是生成以下编译错误

无法将类型'void'隐式转换为'System.Threading.Tasks.Task'

在这种情况下,GetDataAsync方法不需要返回任何内容.如何让它返回我可以等待的任务?

static async void Run()
{
    List<string> IDs = new List<string>() { "a", "b", "c", "d", "e", "f" };
    Task[] tasks = new Task[IDs.Count];
    for (int i = 0; i < IDs.Count; i++)
        tasks[i] = await GetDataAsync(IDs[i]);

    Task.WaitAll(tasks);    
}

async static Task GetDataAsync(string id)
{
    var data = await Task.Run(() => GetDataSynchronous(id));
    // some other logic to display data in ui
}
Run Code Online (Sandbox Code Playgroud)

i3a*_*non 8

由于您尝试将所有调用的结果存储GetDataAsync为任务,因此您不应等待它们.只需删除await,收集所有任务并在最后等待它们.

static void Run()
{
    List<string> IDs = new List<string>() { "a", "b", "c", "d", "e", "f" };
    Task[] tasks = new Task[IDs.Count];
    for (int i = 0; i < IDs.Count; i++)
        tasks[i] = GetDataAsync(IDs[i]);

    Task.WaitAll(tasks);    
}
Run Code Online (Sandbox Code Playgroud)

此外,由于您正在等待同步,因此根本不需要进行Run异步(特别是不async void应该只用于UI事件处理程序)Task.WaitAll.

如果你想异步等待然后make Run async void(只有它是一个UI事件处理程序)并使用Task.WhenAll(tasks)等待所有任务:

static async void Run()
{
    await Task.WhenAll(new[] {"a", "b", "c", "d", "e", "f"}.Select(GetDataAsync));
}
Run Code Online (Sandbox Code Playgroud)