最近,我发现我们正在使用的一段代码运行得很好,但我始终不明白为什么。
我们在通过OwinCommunicationListener托管的服务交换矩阵集群中托管了一个web。
[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秒后执行代码的其余部分。到那个时候,宿主线程应该不会被释放,因为最初的调用是一个Fire-and-Forget (不等待)的调用。
我在这里错过了什么。
发布于 2017-09-22 20:49:49
请求对象与DoSomethingAsync之间没有任何联系。但是,即使您将RequestObj引用直接传递到DoSomethingAsync中,该方法也会毫无问题地完成,因为在您引用对象时,GC不会收集您的RequestObj。此外,一旦异步执行开始,它就会有自己的生命周期,这意味着回调可能会在不同的线程上完成,但请求处理管道与之一起调度。
https://stackoverflow.com/questions/46322755
复制相似问题