没有异步等待,任务是异步的还是同步的?

Task is asynchronous or synchronous without async await?

如果我有 task 而没有 async await,我的 task 会考虑异步还是同步?在 Microsoft doc, it says The tasks run asynchronously and may complete in any order. but in one Whosebug post 中,它表示 Wait will synchronously block until the task completes. So the current thread is literally blocked waiting for the task to complete.

Task is asynchronous or synchronous without async await?

这完全 取决于 Task 本身,与您是否使用 [=11] 没有任何关系 =] 与否。

当您使用 Task.Run() 创建一个新任务时,会将一个工作线程排队到线程池,并且它将 运行 异步 。但是,您也可以从 Task.FromResult() 方法中获取一个 Task 对象,这很简单 returns 一个已完成的任务 同步.

在这两个极端之间的是 async 方法,有时同步完成有时不同步(例如,从文件或网络读取数据,有时数据已经缓冲并可用,有时稍后才能使用。

Stack Overflow post you mention 与任务的异步性质没有任何关系,而是取决于您如何等待 完成任务.当然,同步完成的任务对象在您引用该对象时已经完成,因此 "waiting" 在这样的对象上实际上不会阻塞任何东西。所以有趣的情况是尚未完成的任务对象,即将异步完成的任务对象。

在那些情况下,Wait() 方法将阻塞当前线程。这是设计使然,并且有明确的记录。这几乎不是你想要的。但需要注意的是,即使使用Wait(),任务本身仍然是异步的。您可能已经阻塞了当前线程,但其他事情仍在您的进程中发生,包括该任务代表的任何内容。这些事情与您当前的线程异步发生。

您选择让当前线程不执行任何操作这一事实不会改变您启动的任务的固有异步性质。

更典型的是,您将使用 await 有效地注册您的请求,以便在任务完成后在当前同步上下文中稍后恢复执行当前方法。在 await 语句中,当前方法会将线程返回给调用者,允许它继续做其他事情。在那种情况下,任务仍然是异步完成的,就像您使用 Wait() 并阻塞了线程一样,但现在您当前的线程也有机会做其他事情。

在这两种情况下,任务本身仍然是异步的。您等待它的方式对此没有任何影响。

恕我直言,担心任务是否异步是没有意义的。无论如何,您的代码都应该可以正常工作。相反,将任务视为 "promise" 以在将来的某个时间点提供结果。事实上,"promise" 和 "future" 经常在其他编程环境中代替 "task" 来表示同一事物。有时这个承诺会立即兑现,有时需要一段时间,但对你来说真的无关紧要。重要的是承诺本身,而不是如何或准确地遵守承诺。