这不是"如何在没有等待的情况下安全地调用C#中的异步方法"的副本.
我如何很好地抑制以下警告?
警告CS4014:由于未等待此调用,因此在完成调用之前,将继续执行当前方法.考虑将'await'运算符应用于调用的结果.
一个简单的例子:
static async Task WorkAsync()
{
await Task.Delay(1000);
Console.WriteLine("Done!");
}
static async Task StartWorkAsync()
{
WorkAsync(); // I want fire-and-forget
// more unrelated async/await stuff here, e.g.:
// ...
await Task.Delay(2000);
}
Run Code Online (Sandbox Code Playgroud)
我尝试过但不喜欢的事情:
static async Task StartWorkAsync()
{
#pragma warning disable 4014
WorkAsync(); // I want fire-and-forget here
#pragma warning restore 4014
// ...
}
static async Task StartWorkAsync()
{
var ignoreMe = WorkAsync(); // I want fire-and-forget here
// ...
}
Run Code Online (Sandbox Code Playgroud)
更新后,由于原始接受的答案 …
与此答案相关,
如果我真的想要"Fire and Forget"一个确实返回任务的方法,并且(为简单起见)让我们假设该方法不会抛出任何异常.我可以使用答案中列出的扩展方法:
public static void Forget(this Task task)
{
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法,如果存在错误,则会Task引发异常,然后抛出意外异常时,异常将被吞下并被忽视.
问题:在这种情况下,扩展方法的形式是否更合适:
public static async void Forget(this Task task)
{
await task;
}
Run Code Online (Sandbox Code Playgroud)
因此编程错误会引发异常并升级(通常会导致进程失效).
在具有预期(和可忽略的)异常的方法的情况下,该方法需要变得更加精细(除此之外,关于如何构建此方法的版本的任何建议将采用可接受和可忽略的异常类型的列表? )