Rest API方法中的调用异步方法根本不返回

时间:2015-12-09 13:47:09

标签: c# rest asynchronous async-await

我需要在请求完成后在后台执行一个函数。 我的代码类似于:

[HttpPost]
public HttpResponseMessage Post([FromBody] List<JObject> lstData)
{
     return PostMethod(lstData);
}

 HttpResponseMessage PostMethod(List<JObject> lstData)
{
     //do somework
     Method1();
     return myResult;

}

void Method1()
{
     Method2();
}

async void Method2()
{
     //do some work
     await Task.Delay(25);
     Method2();
}

当此方案运行时,Post根本不返回。 我通过创建执行Method2()的任务来处理它,但我试图利用Asynchronous Programming

1 个答案:

答案 0 :(得分:0)

使用async-await时,最好让async-await语法从应用程序的顶部流向底部。此外,除非它是前端事件处理程序,否则不要返回async void,您希望至少返回异步任务。 async void会导致您出现意外的副作用,例如丢失当前上下文,并且当前方法最终可能会在这些调用中死锁/阻塞。

我建议你重新编写你的方法堆栈到异步任务和异步任务&lt; .Type&gt;,你会在这样一个更好的地方:)。

示例:

[HttpPost]
public async Task<HttpResponseMessage> Post([FromBody] List<JObject>     lstData)
{
  return await PostMethod(lstData);
}

async Task<HttpResponseMessage> PostMethod(List<JObject> lstData)
{
 //do somework
 await Method1();
 return myResult;
}

async Task Method1()
{
   await Method2();
}

async Task Method2()
{
 //do some work
 await Task.Delay(25);
}

然后按照这个整个方法链向下。