簡體   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