我有一个带有以下抽象方法的基本控制器:
[HttpDelete]
public abstract Task<IHttpActionResult> Delete(int id);
在一个特定的控制器中,我不想实现删除,因此方法如下所示:
public override async Task<IHttpActionResult> Delete(int id)
{
return ResponseMessage(Request.CreateResponse(HttpStatusCode.MethodNotAllowed, new NotSupportedException()));
}
虽然以上代码编译,但我收到警告:
这种异步方法缺乏等待&#39;运营商并将同步运行。考虑使用&#39; await&#39;运营商等待非阻塞API调用,或等待Task.Run(...)&#39;在后台线程上进行CPU绑定的工作。
除了忽略上述警告外,还有更好的选择(即更改上面的代码),以便不会发出此警告吗?
修改
我将行更改为:
return await Task.Run(() => ResponseMessage(Request.CreateResponse(HttpStatusCode.MethodNotAllowed, new NotSupportedException())));
这会删除警告。但是,有更好的解决方案吗?
答案 0 :(得分:6)
除了忽略上述警告外,是否有更好的选择 (即更改上面的代码)以便不发生此警告?
另一种方法是删除async
修饰符并使用Task.FromResult
返回Task<IHttpActionResult>
:
public override Task<IHttpActionResult> Delete(int id)
{
return Task.FromResult<IHttpActionResult>(
ResponseMessage(Request.CreateResponse(
HttpStatusCode.MethodNotAllowed,
new NotSupportedException())));
}
答案 1 :(得分:5)
关于完全删除async
的{{3}}通常是删除警告的首选方法,但另一个不会降低性能的正确答案是{{1}已经完成的任务。
await
大致翻译为检查等待任务是否已完成,如果是,则继续同步执行方法的其余部分,如果不是,则将其余部分添加为该任务的延续。
await
在.Net 4.6中,您可以使用新的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()));
}
属性,而不是创建自己的已完成任务。
这使您可以保留方法Task.CompletedTask
并保持Yuval's answer。