忽略async没有await编译警告
本文关键字:编译 警告 await 没有 async 忽略 | 更新日期: 2023-09-27 17:51:05
我有一个具有以下抽象方法的基本控制器:
[HttpDelete]
public abstract Task<IHttpActionResult> Delete(int id);
在一个特定的控制器中,我不想实现删除,所以方法是这样的:
public override async Task<IHttpActionResult> Delete(int id)
{
return ResponseMessage(Request.CreateResponse(HttpStatusCode.MethodNotAllowed, new NotSupportedException()));
}
虽然上面的代码可以编译,但是我得到了一个警告:
这个异步方法缺少'await'操作符,将同步运行。考虑使用'await'操作符来等待非阻塞API调用,或者'await Task.Run(…)'来在后台线程上执行cpu限制的工作。
除了忽略上面的警告,还有更好的选择吗?更改上面的代码)以使此警告不会发生?
编辑
我把这行改成:
return await Task.Run(() => ResponseMessage(Request.CreateResponse(HttpStatusCode.MethodNotAllowed, new NotSupportedException())));
这将删除警告。然而,有更好的解决方案吗?
除了忽略上面的警告,还有更好的选择吗(即。更改上面的代码)以使此警告不会发生?
另一种选择是删除async
修饰符并使用Task.FromResult
返回Task<IHttpActionResult>
:
public override Task<IHttpActionResult> Delete(int id)
{
return Task.FromResult<IHttpActionResult>(
ResponseMessage(Request.CreateResponse(
HttpStatusCode.MethodNotAllowed,
new NotSupportedException())));
}
虽然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()));
}
在。net 4.6中,您可以使用新的Task.CompletedTask
属性,而不是创建自己的已完成任务。
这使您可以保留方法async
,并与它保持相同的错误处理语义。