簡體   English   中英

什么是等待 Task.Run 執行異步 lambda 的好選擇?

[英]What is a good alternative to await Task.Run executing an asyncronous lambda?

我正在使用BackgroundWorker升級舊代碼。 根據 Stephen Cleary 就此事發表的一系列文章,我認為在這種情況下理想的替代品是Task.Run()

我的是 Windows Forms 應用程序。 根據BackgroundWorker模式,在構造 Form 時,將啟動不同的后台操作並將其結果收集在不同的事件處理程序中。

現在,我的新方法遵循 async/await 模式。 我對在異步方法上調用Task.Run() 有一些擔憂

private async void FormEventHandler(object sender, EventArgs e)
{
    Task.Run(async () => await AwaitableLongRunningTask_1());
    Task.Run(async () => await AwaitableLongRunningTask_2());
    //...
}

AwaitableLongRunningTask_1 和 _2 需要是異步的,因為它們在方法主體中進行的調用是對異步方法的。

我不能以簡單的 await 連續調用它們:

private async void FormEventHandler(object sender, EventArgs e)
{
    await AwaitableLongRunningTask_1();
    await AwaitableLongRunningTask_2();
    //...
}

因為它們需要並行啟動,而且它們顯然是跨越幾秒鍾的長時間運行的任務。

所以我的問題是,我是否需要將 AwaitableLongRunningTasks 重構為非異步 void,改變它們的內部行為,如“如何從同步方法調用異步方法”中所建議的那樣 我錯過了更好的選擇嗎?

使用Task.WhenAll

private async void FormEventHandler(object sender, EventArgs e)
{
    await Task.WhenAll( 
            AwaitableLongRunningTask_1(), 
            AwaitableLongRunningTask_2());

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM