如果我不关心返回值,我是否应该等待一个'async Task'函数?

24 浏览
0 Comments

如果我不关心返回值,我是否应该等待一个'async Task'函数?

如果一个async Task函数不返回任何内容,我是否需要等待它?这样做会导致后续的代码被封装在委托中,在async Task函数返回后执行吗?\n在上面的例子中,如果我在Test()函数中等待DoSomethingAsync(),这会导致后续的代码Console.WriteLine被封装在委托中,并在异步任务完成后延迟执行吗?

0
0 Comments

在使用异步任务时,如果你不关心其返回值,那么是否应该等待(async Task)函数的完成呢?这个问题的出现原因是,如果你的程序在任务完成之前退出,那么你就会遇到问题。你至少希望在允许退出之前等待所有/任意一个任务完成。如果你不知道未等待的任务何时完成,你还应该考虑到这些任务同时运行的任何影响。同时,不能依赖于异常来向调用者传递信息。

一个更好的方法可能是始终在顶层调用者处等待,只在真正需要的最后时刻等待(比如应用即将退出时)。

关于Console.WriteLine的问题,如果你等待前一行代码,它将在完成后才打印。如果你不等待,它将与任务中执行的代码竞争。

解决这个问题的方法是,在调用异步任务时始终使用await关键字来等待任务完成。这样可以确保在退出程序之前,所有的任务都已经完成。同时,也可以确保异常能够正确地传递给调用者。

以下是一个示例代码,演示了如何在调用异步任务时使用await关键字:

async Task DoAsyncTask()
{
    await Task.Delay(1000); // 模拟一个异步任务
    Console.WriteLine("Task completed");
}
async Task Main()
{
    var task = DoAsyncTask(); // 调用异步任务
    // 其他代码...
    
    await task; // 等待任务完成
    
    Console.WriteLine("Program finished");
}

通过在调用DoAsyncTask函数时使用await关键字,我们可以确保在程序退出之前等待任务完成。这样,无论我们是否关心任务的返回值,都可以避免因为任务未完成而导致的问题。

0
0 Comments

在使用异步任务函数时,如果不关心它的返回值,是否需要等待它的完成呢?

通常来说,是的。这样做不仅可以让你检测到它何时完成,还可以响应任何错误。如果你希望的话,你可以存储Task对象,并在以后await它。

不等待任务的完成就是所谓的"fire and forget",字面上的意思是:

  • 你不关心它是否完成。
  • 你不关心它何时完成。
  • 你不关心它是成功还是失败。

真正需要使用fire-and-forget场景非常罕见。

在异步函数返回的Task完成之后,下面的代码会被包装在一个委托中执行。

0