如果我不关心它的返回值,我应该等待一个“异步任务”函数吗? [复制]

Posted

技术标签:

【中文标题】如果我不关心它的返回值,我应该等待一个“异步任务”函数吗? [复制]【英文标题】:Should I await a 'async Task' function if I don't care its return value? [duplicate] 【发布时间】:2017-08-23 11:41:34 【问题描述】:

如果异步任务函数没有返回任何内容,我是否需要等待它?这是否会导致以下代码被包装在委托中并在异步任务函数返回后执行?

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 被包装在委托中,并且仅在异步任务完成时才执行延迟?

【问题讨论】:

我认为没有理由这样做。 如果你这样调用它,它将同步运行。 @dcg 不,不会。它只会在完成之前继续。 请记住async / await在控制台应用程序中的行为不同(无法判断这是真正的控制台应用程序,还是仅用作示例)。 【参考方案1】:

如果异步任务函数没有返回任何内容,我是否需要等待它?

一般来说,是的。这不仅允许您检测何时完成,还允许您响应任何错误。如果您愿意,您可以存储Task 对象和await 稍后。

等待任务是“一劳永逸”,字面意思是:

你不在乎它是否完成。 你不在乎它什么时候完成。 你不在乎它是成功还是失败。

真正的“即发即弃”场景非常罕见。

这是否会导致以下代码被包装在委托中并在异步任务函数返回后执行?

在异步函数返回的Task完成后,是的。

【讨论】:

【参考方案2】:

如果您不这样做并且您的程序在任务完成之前退出,那么您就完蛋了。您至少希望在允许退出之前等待所有/任何这些任务。如果您不知道未等待的任务何时完成,您还应该考虑同时运行这些任务的多个实例的任何影响。也不能依赖异常来冒泡给调用者。

更好的方法可能是始终在***调用者处等待,仅在您真正需要的最晚可能时刻等待(例如,如果应用程序即将退出)

关于 Console.WriteLine 的问题 - 是的,如果您等待上一行,它只会在完成后打印。如果您不等待,它将与任务中执行的代码竞争。

【讨论】:

以上是关于如果我不关心它的返回值,我应该等待一个“异步任务”函数吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot - 异步任务

使用 SendGrid 了解异步任务和等待 [重复]

没有等待或返回的 C# 异步任务方法

“异步任务然后等待任务”与“任务然后返回任务”[重复]

shell 异步任务模拟多线程

如果我不关心插入速度,我应该将 S3 与 Redshift 一起使用吗?