首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OwinCommunicationListener中托管的异步Web Api中的触发和遗忘方法

在OwinCommunicationListener中托管的异步Web Api中的触发和遗忘方法
EN

Stack Overflow用户
提问于 2017-09-20 20:58:17
回答 1查看 388关注 0票数 1

最近,我发现我们正在使用的一段代码运行得很好,但我始终不明白为什么。

我们在通过OwinCommunicationListener托管的服务交换矩阵集群中托管了一个web。

代码语言:javascript
复制
[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不是等待的,但它每次都完成它的工作。如果我添加

代码语言:javascript
复制
await Task.Delay(10000);

然后,API几乎在瞬间响应,并且在10秒后执行代码的其余部分。到那个时候,宿主线程应该不会被释放,因为最初的调用是一个Fire-and-Forget (不等待)的调用。

我在这里错过了什么。

EN

回答 1

Stack Overflow用户

发布于 2017-09-22 20:49:49

请求对象与DoSomethingAsync之间没有任何联系。但是,即使您将RequestObj引用直接传递到DoSomethingAsync中,该方法也会毫无问题地完成,因为在您引用对象时,GC不会收集您的RequestObj。此外,一旦异步执行开始,它就会有自己的生命周期,这意味着回调可能会在不同的线程上完成,但请求处理管道与之一起调度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46322755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档