簡體   English   中英

激發並忘記而沒有異步無效

[英]Fire and forget without async void

我有三種方法,第一種結果將在接下來的兩種方法中使用,並且沒有數據會返回。

 result= await DataAccess.Query(param); //Query 
    await DataAccess.Create(result);
    await DataAccess.Update(result);
  1. 我真的需要在這里使用await嗎?

  2. 在創建和更新功能中使用異步void是否正確?

  3. 在這里生火忘卻的正確方法是什么?
  4. 如果我沒有提到異步,那將是生與死嗎?
  5. 如果異步僅用於同步運行,那么不等待就意味着什么呢? 沒有那個關鍵字,我什至可以實現。

預計不會返回任何數據。

錯誤呢? 如果發生錯誤,是否需要返回錯誤代碼,或者即使CreateUpdate失敗也200 OK接受200 OK

我假設您需要一個錯誤代碼。 99.99%的電話可以。

我真的需要在這里使用await嗎?

好吧,如果您需要同步方法,則可以只調用同步API。 不過,我不知道您為什么要那樣。

提醒一下: await與返回瀏覽器無關 它與減少線程池線程數有關,從而使您的服務器進一步擴展。

在創建和更新功能中使用異步void是否正確?

沒有永不。

在這里生火忘卻的正確方法是什么?

正確的方法是“不要”。 即棄即忘很難正確執行,事實上,由於您需要錯誤代碼, 因此無法進行即棄即忘。

在我的博客上寫了更多有關“ Task.Run包括為什么StartNewTask.Run是無效的解決方案。 請注意,唯一完全可靠的解決方案(包括升級方案)是最后一個(分布式體系結構)。

如果異步僅用於同步運行,那么不等待就意味着什么呢? 沒有那個關鍵字,我什至可以實現。

它的連續運行(按順序),不同步 (阻塞線程)。 async的好處是允許更大的可伸縮性。 有關更多信息,請參見我的ASP.NET async介紹文章。

如果您需要按特定順序調用多個方法,但是這整套功能可以異步運行,我可以這樣做:

Task.Run(() =>
{
    result = Function();
    Create(result);
    Update(result);
});

這會將功能組分成新線程。 由於您不等待此任務,因此請放手忘卻。

如果您的函數定義為異步,則可以等待它們完成,如下所示:

Task.Run(() =>
{
    var task = Function();
    task.Wait();
    var result = task.Result;

    Create(result).Wait();
    Update(result).Wait();
});

但是當您不想從異步方法中受益時,最好重寫方法以使其同步運行並使用第一個代碼

暫無
暫無

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

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