【问题标题】:Call Async method inside Rest API method not returns at all在 Rest API 方法中调用 Async 方法根本不返回
【发布时间】:2015-12-09 13:47:08
【问题描述】:

我需要一个函数在请求完成后在后台执行。 我的代码是这样的:

[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

【问题讨论】:

  • 这是您的实际代码吗?如果Method2递归调用自己,这应该stackoverflow。
  • 尝试使用PostMethod(lstData).Result
  • 是的,它正在监视一个列表并在有任何项目时对其进行处理。我正在使用延迟来防止 stackoverflow。
  • 那你什么时候返回结果呢?请发帖minimal reproducible example
  • 您似乎没有完全了解请求的生命周期。您基本上是在尝试启动一种类似 Windows 服务的方法,以便在您的方法返回并响应后继续运行,但这是行不通的。如果您需要在异步方法中发生某些事情然后返回,您可以等待它或使用延续在完成后返回响应。

标签: c# rest asynchronous async-await


【解决方案1】:

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

我建议你将你的方法堆栈重写为 async Task 和 async Task<.type>,这样你会处于一个更好的位置:)。

例子:

[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);
}

并遵循整个方法链。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多