【发布时间】:2016-01-30 07:45:35
【问题描述】:
我有一些关于 TPL 的问题。
如您所见,我正在创建 2 个简单任务并将它们添加到列表中。
问题(预期行为)是任务在点击WorkMethodAsync 中的“等待”后立即返回,因此使Task.WhenAll 无用。
有没有办法等待子任务完成?
我发现的唯一解决方法是将 WorkMethodAsync 伪装成同步的。
private async void button1_Click(object sender, EventArgs e)
{
Tasks = new List<Task>();
var myTask1 = Task.Factory.StartNew(async () => await WorkMethodAsync(), CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
var myTask2 = Task.Factory.StartNew(async () => await WorkMethodAsync(), CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
Tasks.Add(myTask1);
Tasks.Add(myTask2);
await Task.WhenAll(Tasks.ToArray());
}
private async Task WorkMethodAsync()
{
while (true)
{
await Task.Delay(10000);
}
return;
}
【问题讨论】:
-
@AsadSaeeduddin 这是一个事件处理程序。在这种情况下(并且仅在这种情况下)使用
async void非常好。 -
@i3arnon 是的,我知道这一点。但是,当您返回 void 时,调用方法不会等待
Task.WhenAll的结果,这就是我认为可能存在的问题。我阅读了您的回答并意识到问题是您收到了一个Task<Task>,它正在立即完成。
标签: c# .net multithreading async-await task-parallel-library