[英]Task.Run with async/await inside and await.Task.Run both calling void method
到底有什么區別?
Visual Studio 說當前方法的執行繼續,因為沒有等待調用。
對於第一個片段,所以我想知道應用等待有什么區別? 是不是當你除了一個結果?
我正在返回 void,它是通過使用 jquery 的 ajax 請求調用的。 它們本質上是否相同。 但一個是當你期待結果的時候?
這適用於向 api 發送請求的 asp.net web 應用程序。
1
Task.Run(async () =>
{
await AMethod().ContinueWith(x => x.IsCompleted);
});
2
await Task.Run(async () =>
{
await AMethod().ContinueWith(x => x.IsCompleted);
});
3
await Task.Run(() => AMethod().ContinueWith(x => x.IsCompleted));
我基本上想了解它們在性能方面是否在線程池上有不同的結果。
AMethod
創建一個新任務,添加一個ContinueWith
並等待該結果。 不等待外部任務。您還沒有輸入另一個選項:
await Task.Run(AMethod).ContinueWith(x => x.IsCompleted);
AMethod
並返回它的任務創建的,它有一個延續。 正在等待生成的任務。 所有這些任務都在 GUI 應用程序的調用者線程上運行,除非使用ConfigureAwait(false)
。 它們是通過回調運行的,最大的問題不是線程池對線程池有什么影響,而是您建議如何處理異常而不await
打開它們。
我想知道應用等待有什么區別? 是不是當你除了一個結果?
不,這是您想要異步“暫停”當前方法直到被調用方法完成的時候。
需要明確的是,您幾乎總是希望在 ASP.NET 上執行此操作,因為請求外部代碼很危險。 第一個代碼片段正在執行的操作稱為“ 一勞永逸”,它根本不是以安全的方式執行的。
旁注:
ContinueWith
; 改用await
。 ContinueWith
是一種低級的危險方法。Task.Run
上運行 Task.Run。 它可能會干擾 ASP.NET 對線程池的使用,並且不會為您的代碼提供任何實際好處。正確使用的代碼是:
var result = await AMethod();
_ = result.IsCompleted;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.