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)
由于您尝试将所有调用的结果存储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)
| 归档时间: |
|
| 查看次数: |
9948 次 |
| 最近记录: |