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

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)

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

Yuv*_*kov 6

除了忽略上述警告之外,是否有更好的替代方案(即更改上面的代码)以便不会发生此警告?

另一种方法是删除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)


i3a*_*non 5

虽然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,并保持相同的错误处理语义.