繁体   English   中英

Task.WhenAll - 不等待子任务完成

[英]Task.WhenAll - not waiting for child tasks to finish

我对TPL有一些问题。 如您所见,我正在创建2个简单任务并将它们添加到列表中。 问题(预期的行为)是在WorkMethodAsync点击“await”后立即返回任务因此呈现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;
}

问题是你使用Task.Factory.StartNew而不是Task.Run

StartNew是在async-await之前构建的,因此不能很好地支持它。 在这种情况下,由于您的委托返回一个任务, StartNew创建一个任务,返回值为Task<Task>> 您可以使用Unwrap来获取表示整个异步操作的任务:

Task<Task> myTask1 = Task.Factory.StartNew(async () => await WorkMethodAsync(), CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
Task<Task> myTask2 = Task.Factory.StartNew(async () => await WorkMethodAsync(), CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);

Tasks.Add(myTask1.Unwrap());
Tasks.Add(myTask2.Unwrap());

但是,没有理由使用Task.Factory.StartNew开始,因为TaskCreationOptions.LongRunning对于异步方法没有意义(更多关于我的博客: LongRunning对于Task.Run使用async-await是没用的 )所以你可以使用Task.Run

var myTask1 = Task.Run(() => WorkMethodAsync());
var myTask2 = Task.Run(() => WorkMethodAsync());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM