在OwinCommunicationListener中托管的Async Web Api中的Fire和Forget方法

时间:2017-09-20 12:58:17

标签: c# asp.net-web-api owin azure-service-fabric

最近我可以浏览我们正在使用的代码,并且工作正常,对于我的生活,我无法弄清楚原因。

我们在通过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,如果以后稍早完成,它会发生,但它永远不会。但/ / p>

我期待一些错误,因为任务DoSomething没有等待,但它每次都完成它的工作。如果我添加

await Task.Delay(10000);

然后API响应几乎瞬间完成,并在10秒后执行其余的代码。此时不应该处理主机线程,因为原始呼叫是Fire-and-Forget(未等待)。

我在这里缺少什么。

1 个答案:

答案 0 :(得分:0)

没有任何东西可以将请求对象与DoSomethingAsync联系起来。但即使您将RequestObj引用权传递给DoSomethingAsync,该方法也会毫无问题地完成,因为GC在您引用该对象时不会收集您的RequestObj。此外,一旦异步执行启动,它就会过着自己的生命,这意味着回调可能会在不同的线程上完成,但是请求处理管道已经被调度。