从空异步方法中抑制警告

时间:2014-01-16 07:24:04

标签: c# asynchronous warnings async-await

让我们继续说我有以下功能:

public class Test
{
    public async Task Finalize()
    {
        // We don't need this in this class, so empty body
    }

    /*
     * Additional methods snipped
     */
}

虽然这很好用,但我会收到编译器警告说:

  

这种异步方法缺少'await'运算符并将同步运行。考虑使用'await'运算符等待非阻塞API调用,或'await Task.Run(...)'在后台线程上执行CPU绑定工作。

如果不过多修改方法,绕过此警告的最佳方法是什么?在这种情况下,我无法抛出异常,因为该方法将被调用,但此时绝对不会发生任何事情,因为我正在讨论的类没有什么可以完成的。

5 个答案:

答案 0 :(得分:62)

这种方法会阻止编译器警告而不是静音:

对于任何感兴趣的人,如果你需要绕过这样的编译器警告:

public async Task DoStuff
{
    // This method should stay empty
    // Following statement will prevent a compiler warning:
    await Task.FromResult(0);
}

答案 1 :(得分:32)

当您使用异步接口的同步(或noop)实现时,这是一个常见的问题。

您只需返回已完成的Task即可实现async - 返回方法而不使用Task关键字:

public Task FinalizeAsync()
{
  return Task.FromResult(0);
}

但是,每次调用它时仍会分配Task。如果您发现自己做了很多,可能需要缓存已完成的Task实例。我的AsyncEx库为此目的提供了许多task constants

public Task FinalizeAsync()
{
  return TaskConstants.Completed;
}

最后,您可能需要查看asynchronous disposal上的博客文章,了解其他两种方法。

答案 2 :(得分:14)

您可以将以下指令放在文件中:

#pragma warning disable 1998

但是,我建议单独留下警告,并征求意见。这是一个充分理由的警告;)

编辑:如果您只想为一种方法禁用警告,则可以执行以下操作:

#pragma warning disable 1998
async Task Foo() {}
#pragma warning restore 1998

答案 3 :(得分:11)

在.Net 4.6之前,我们必须返回一个我们不需要的虚拟值。但是,现在我们可以这样做:

public async Task MyFunctionAsync()
{
    // Some works here...
    await Task.CompletedTask;
}

答案 4 :(得分:-1)

删除" async"并且警告消失了:

public class Test
{
    public void Finalize()
    {
        // We don't need this in this class, so empty body
    }
 }