【问题标题】:Would this program be considered asynchronous?这个程序会被认为是异步的吗?
【发布时间】:2026-01-16 22:55:02
【问题描述】:

假设我有一个简单的程序,比如

public static main(string[] args)
{
    Task<int> hotTask = Task<int>.Run(() => SomethingThatRunsInBackgroundAndReturnsAnInt());
    DoIndependentWork();
    hotTask.Wait(); 
    Console.WriteLine(hotTask.Result);
}

这在技术上是否是“同步的”,尽管它运行一个不需要在下一个工作单元 (DoIndependentWork()) 开始和完成之前完成的后台线程?我在互联网上的任何地方都找不到非常好的技术定义。

【问题讨论】:

  • 在我看来确实是异步的。您可能会考虑重写它以将大部分工作移出 main 并进入异步辅助方法。
  • 主函数是同步的,因为 .Wait()。但是,由于主要同步处理 2 个任务,您可以调用此并行处理。我很想知道为什么你的程序命名如此重要。
  • 谁在强迫你遵守一个或另一个定义?该程序是否工作?证明是正确的吗?这些问题不是比尝试对程序进行分类更好吗?如果您确实需要将您的程序分类为同步或异步,我宁愿看看您的问题制定者定义了哪些具体规则。
  • 在旁注中,我很嫉妒你得到了@EricLippert 本人的回答。恭喜!

标签: c# .net multithreading asynchronous task


【解决方案1】:

据此: Asynchronous vs synchronous execution, what does it really mean?

当你同步执行某事时,你等待它完成 在继续执行另一项任务之前。当你执行某事时 异步,您可以在完成之前继续执行另一个任务。

你的情况是SomethingThatRunsInBackgroundAndReturnsAnInt() 而且你不等待任务结束,而是执行另一个函数,这意味着它是一个异步程序

【讨论】:

    【解决方案2】:

    是的,有点,但从技术上讲,没有

    也许这是个小问题,但我会声明你的程序使用异步操作,但不是本身异步的。这是因为程序的main方法在程序完成处理之前不会返回。

    当我们谈论异步方法时,我们不是在谈论使用多个线程的方法;我们正在谈论一种几乎立即返回并且在工作完成之前返回的方法。同样,对于一个程序,我们不是在谈论一个使用多个线程的程序,而是一个在工作完成之前几乎立即返回的程序。

    一个异步程序的例子是Windows Service。操作系统将调用服务的OnStart 方法,该方法几乎立即返回。同时,该服务维护另一个异步执行主要工作的线程。

    因此,您的程序不符合定义。

    【讨论】: