最近我可以浏览我们正在使用的代码,并且工作正常,对于我的生活,我无法弄清楚原因。
我们在通过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(未等待)。
我在这里缺少什么。
答案 0 :(得分:0)
没有任何东西可以将请求对象与DoSomethingAsync联系起来。但即使您将RequestObj引用权传递给DoSomethingAsync,该方法也会毫无问题地完成,因为GC在您引用该对象时不会收集您的RequestObj。此外,一旦异步执行启动,它就会过着自己的生命,这意味着回调可能会在不同的线程上完成,但是请求处理管道已经被调度。