簡體   English   中英

Task.Run 內部帶有 async/await 和 await.Task.Run 都調用 void 方法

[英]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));

我基本上想了解它們在性能方面是否在線程池上有不同的結果。

  1. 啟動一個新任務。 這將運行一個異步方法,該方法為AMethod創建一個新任務,添加一個ContinueWith並等待該結果。 不等待外部任務。
  2. 除了外部任務也在等待之外,其他相同。
  3. 外層任務在等待,內層任務也在等待,但繼續仍在內層任務上。

您還沒有輸入另一個選項:

  1. await Task.Run(AMethod).ContinueWith(x => x.IsCompleted);
    外部任務是直接調用AMethod並返回它的任務創建的,它有一個延續。 正在等待生成的任務。

所有這些任務都在 GUI 應用程序的調用者線程上運行,除非使用ConfigureAwait(false) 它們是通過回調運行的,最大的問題不是線程池對線程池有什么影響,而是您建議如何處理異常而不await打開它們。

我想知道應用等待有什么區別? 是不是當你除了一個結果?

不,這是您想要異步“暫停”當前方法直到被調用方法完成的時候。

需要明確的是,您幾乎總是希望在 ASP.NET 上執行此操作,因為請求外部代碼很危險。 第一個代碼片段正在執行的操作稱為“ 一勞永逸”,它根本不是以安全的方式執行的。

旁注:

  1. 不要使用ContinueWith 改用await ContinueWith是一種低級的危險方法。
  2. 避免在Task.Run上運行 Task.Run。 它可能會干擾 ASP.NET 對線程池的使用,並且不會為您的代碼提供任何實際好處。

正確使用的代碼是:

var result = await AMethod();
_ = result.IsCompleted;

暫無
暫無

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

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