Iva*_*ono 5 c# task-parallel-library async-await asp.net-web-api visual-studio-2012
我有一个基本控制器与以下抽象方法:
[HttpDelete]
public abstract Task<IHttpActionResult> Delete(int id);
Run Code Online (Sandbox Code Playgroud)
在一个特定的控制器中,我不想实现删除,因此该方法如下所示:
public override async Task<IHttpActionResult> Delete(int id)
{
return ResponseMessage(Request.CreateResponse(HttpStatusCode.MethodNotAllowed, new NotSupportedException()));
}
Run Code Online (Sandbox Code Playgroud)
虽然上面的代码编译,但我收到警告:
这种异步方法缺少"等待"运算符并将同步运行.考虑使用'await'运算符等待非阻塞API调用,或'await Task.Run(...)'在后台线程上执行CPU绑定工作.
除了忽略上述警告之外,是否有更好的替代方案(即更改上面的代码)以便不会发生此警告?
编辑
我将行更改为:
return await Task.Run(() => ResponseMessage(Request.CreateResponse(HttpStatusCode.MethodNotAllowed, new NotSupportedException())));
Run Code Online (Sandbox Code Playgroud)
这会删除警告.但是,有更好的解决方案吗?
除了忽略上述警告之外,是否有更好的替代方案(即更改上面的代码)以便不会发生此警告?
另一种方法是删除async修饰符并使用Task.FromResult返回Task<IHttpActionResult>:
public override Task<IHttpActionResult> Delete(int id)
{
return Task.FromResult<IHttpActionResult>(
ResponseMessage(Request.CreateResponse(
HttpStatusCode.MethodNotAllowed,
new NotSupportedException())));
}
Run Code Online (Sandbox Code Playgroud)
虽然Yuval关于async完全删除的回答通常是删除警告的首选方法,但另一个不会降低性能的正确答案是await已经完成的任务.
await 大致翻译为检查等待任务是否已完成,如果是,则继续同步执行方法的其余部分,如果不是,则将其余部分添加为该任务的延续.
private static readonly Task _completedTask = Task.FromResult(false);
public override async Task<IHttpActionResult> Delete(int id)
{
await _completedTask;
return ResponseMessage(Request.CreateResponse(HttpStatusCode.MethodNotAllowed, new NotSupportedException()));
}
Run Code Online (Sandbox Code Playgroud)
在.Net 4.6中,您可以使用新Task.CompletedTask属性而不是创建自己的已完成任务.
这使您可以保留方法async,并保持相同的错误处理语义.
| 归档时间: |
|
| 查看次数: |
2020 次 |
| 最近记录: |