忽略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没有await编译警告

除了忽略上面的警告,还有更好的选择吗(即。更改上面的代码)以使此警告不会发生?

另一种选择是删除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,并与它保持相同的错误处理语义。