忽略异步而不等待编译警告

时间:2015-05-28 08:28:16

标签: c# visual-studio-2012 asp.net-web-api async-await task-parallel-library

我有一个带有以下抽象方法的基本控制器:

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

这会删除警告。但是,有更好的解决方案吗?

2 个答案:

答案 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