簡體   English   中英

由OwinCommunicationListener托管的Async Web Api中的Fire and Forget方法

[英]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.

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