让我们继续说我有以下功能:
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绑定工作。
如果不过多修改方法,绕过此警告的最佳方法是什么?在这种情况下,我无法抛出异常,因为该方法将被调用,但此时绝对不会发生任何事情,因为我正在讨论的类没有什么可以完成的。
答案 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)
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
}
}