[英]Fire and Forget method in Async Web Api hosted in OwinCommunicationListener
最近,我可以看到我們正在使用並且運行良好的代碼,對於我自己的一生,我不知道為什么。
我們在由OwinCommunicationListener托管的服務矩陣群集中托管了一個Web API。
[HttpPost]
public async Task<HttpResponseMessage> WebApiMethod(RequestObject request)
{
string test;
SomeObject obj;
....
DoSomethingAsync(test, obj);
return this.ActionContext.CreateResponse(HttpStatusCode.OK, new { Status = "Success" });
}
private async Task DoSomethingAsync(string param1, SomeObject param2)
{
.....
await SomeOtherAsyncMethod();
.....
}
據我了解,這應該是DoSomethingAsync方法完成與處理請求之間的競爭條件,並且應該拋出TaskCancelledException或以后提早完成的某些操作,但是永遠不會成功。
我期待出現一些錯誤,因為任務DoSomething尚未等待,但每次都能完成其工作。 如果我加
await Task.Delay(10000);
然后,API幾乎立即就會響應,並在10秒鍾后執行其余代碼。 那時不應該處置主機線程,因為最初的調用是即發即棄(未等待)。
我在這里想念什么。
沒有什么可以將請求對象與DoSomethingAsync綁定在一起。 但是,即使您將RequestObj引用權限直接傳遞給DoSomethingAsync,該方法也不會出現問題,因為在引用對象時GC不會收集您的RequestObj。 同樣,一旦異步執行開始,它就擁有了自己的生命,這意味着回調可能在另一個線程上完成,但已與請求處理管道一起調度了該線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.