如果我不关心 'async Task' 函数的返回值,是否应该等待它完成?

8

如果一个async Task函数没有返回任何内容,我需要等待它吗?这会导致后面的代码被包装在委托中,在async Task函数返回后执行吗?

Task DoSomethingAsync()
{
    return Task.Run(() =>
    {
        // Do something, but doesn't return values.
    });
}

void Test()
{
    DoSomethingAsync();  // should I await?

    // Do other things, totally not related to the async function
    Console.WriteLine("aaa");
}

在上面的例子中,如果我在Test()中等待DoSomethingAsync(),那么下面的代码Console.WriteLine会被包装在委托中并延迟执行,直到异步任务完成吗?

我看不出任何理由。 - Trey
1
如果你这样调用它,它将同步运行。 - dcg
2
@dcg 不会的。它只会在完成之前继续执行。 - Servy
请记住,在控制台应用程序中,async/await的行为与其他类型的应用程序不同(无法确定这是否是真正的控制台应用程序,还是只是作为示例使用)。 - Bradley Uffner
2个回答

5
如果async Task函数不返回任何内容,我需要等待它吗?
通常是的。这不仅可以让你“检测它何时完成”,还可以让你“响应任何错误”。如果愿意,可以存储Task对象并稍后await它。
不等待该任务被称为“fire and forget”,字面意思是:
- 你不关心它是否完成。 - 你不关心它何时完成。 - 你不关心它成功或失败。
真正的fire-and-forget场景非常少见。
那会导致以下代码被封装在委托中,在异步任务函数返回后执行吗?
是的,在async函数返回的Task完成后执行。

2
如果您没有在任务完成之前退出程序,那么你将面临困境。您至少需要等待所有/任何这些任务完成才能允许退出。如果您不知道未等待的任务何时完成,还应考虑这些任务的多个实例同时运行的任何影响。异常也不能保证向调用者冒泡。
更好的方法可能是始终在顶层调用者处等待,在真正需要等待的最后一刻才等待(例如,如果应用即将退出)。
关于Console.WriteLine的问题-是的,只有在等待上一行之后才会打印完成。如果您不等待,则会与正在执行任务的代码竞争。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接