[英]Fire and forget without async void
我有三種方法,第一種結果將在接下來的兩種方法中使用,並且沒有數據會返回。
result= await DataAccess.Query(param); //Query
await DataAccess.Create(result);
await DataAccess.Update(result);
我真的需要在這里使用await嗎?
在創建和更新功能中使用異步void是否正確?
預計不會返回任何數據。
錯誤呢? 如果發生錯誤,是否需要返回錯誤代碼,或者即使Create
或Update
失敗也200 OK
接受200 OK
?
我假設您需要一個錯誤代碼。 99.99%的電話可以。
我真的需要在這里使用await嗎?
好吧,如果您需要同步方法,則可以只調用同步API。 不過,我不知道您為什么要那樣。
提醒一下: await
與返回瀏覽器無關 。 它與減少線程池線程數有關,從而使您的服務器進一步擴展。
在創建和更新功能中使用異步void是否正確?
沒有永不。
在這里生火忘卻的正確方法是什么?
正確的方法是“不要”。 即棄即忘很難正確執行,事實上,由於您需要錯誤代碼, 因此無法進行即棄即忘。
我在我的博客上寫了更多有關“ Task.Run
包括為什么StartNew
和Task.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.