繁体   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