卡住异步任务和等待
问题描述:
我不知道这个代码有什么问题,但它仍然没有响应所需的值。卡住异步任务和等待
这是我的示例代码:
的WebAPI 2:
KOTController.cs
[HttpGet]
[Route("testasync")]
public IHttpActionResult TestAsync()
{
try
{
return Ok(_iKOTManager.TestAsync());
}
catch (Exception ex)
{
logger.Error(ex);
return null;
}
}
接口
个IKOTManager.cs
Task<int> TestAsync();
KOTManager.cs
public async Task<int> TestAsync()
{
return await Task.Run<int>(() =>
{
return 999 + 23;
});
}
当我把这个API的请求时,它会返回这样的事情不是数字
<TaskOfint xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/System.Threading.Tasks"/>
任何建议将非常有帮助。谢谢。
答
你得到的回应是因为你返回任务而没有实际执行它。该框架只是序列化任务对象并返回。
重构的动作,以在界面返回Task
然后await
方法
[HttpGet]
[Route("testasync")]
public async Task<IHttpActionResult> TestAsync() {
try {
return Ok(await _iKOTManager.TestAsync());
} catch (Exception ex) {
logger.Error(ex);
return InternalServerError();
}
}
参考:Async/Await - Best Practices in Asynchronous Programming
此外,在例外的情况下,你应该返回,而不是null
相应的结果。这应该最终被重构,因为处理控制器内的错误被认为是cross-cutting concern。控制者应该尽可能的精益。
[HttpGet]
[Route("testasync")]
public async Task<IHttpActionResult> TestAsync() {
return Ok(await _iKOTManager.TestAsync());
}
答
您需要将您的控制器更改为async
然后await
该任务。即
public async Task<IHttpActionResult> TestAsync()
...
return Ok(await _iKOTManager.TestAsync());
见async
/await
here的文档。
答
你的操作方法,在消费/调用异步方法,你需要让你的操作方法,以及异步返回Task<T>
的返回类型,如:
[HttpGet]
[Route("testasync")]
public async Task<IHttpActionResult> TestAsync()
{
try
{
return Ok(await _iKOTManager.TestAsync());
}
catch (Exception ex)
{
logger.Error(ex);
return null;
}
}
如果我们呼吁一个异步方法,如果可能的话,我们应该调用方法以及异步并在所有调用链中返回Task<T>
。
希望它有帮助!
重构返回任务的动作然后等待接口上的方法 – Nkosi