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

史蒂夫

如果task没有async await,我会task考虑异步还是同步?Microsoft doc中,它说,The tasks run asynchronously and may complete in any order.但是在一个stackoverflow帖子中,它说Wait will synchronously block until the task completes. So the current thread is literally blocked waiting for the task to complete.

彼得·杜尼奥

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

这就要看完全Task本身,将有没有与你是否使用await与否。

当您Task.Run()用来创建新任务时,该任务会将工作线程放入线程池,并且它将异步运行但是,您还可以TaskTask.FromResult()方法中获取一个对象,该对象同步地轻松返回已完成的任务

在这两种极端之间async,有些方法有时会同步完成而有时却无法完成(例如,从文件或网络中读取数据,其中的数据有时已经被缓冲并且可以使用,而有时则要等到以后才可用)。

您提到Stack Overflow帖子与任务的异步性质没有任何关系,而是取决于您等待任务完成的方式而发生的事情当然,同步完成的任务对象在您引用该对象时已经完成,因此在该对象上“等待”实际上不会阻塞任何对象。因此,有趣的情况是尚未完成的任务对象,即将异步完成的任务对象。

在这种情况下,该Wait()方法将阻塞当前线程。这是设计使然,并且有据可查。这几乎永远不是您想要的。但是要注意,即使使用Wait(),任务本身仍然是异步的,这一点很重要您可能已经阻止了当前线程,但是您的进程中仍在发生其他事情,包括该任务所代表的一切。这些事情与您当前的线程异步发生。

您选择使当前线程什么都不做的事实并不会改变您启动的任务的固有异步性质。

通常,await一旦任务完成,您将用于有效地注册请求,以使当前方法稍后在当前同步上下文中恢复执行。在该await语句处,当前方法将把线程返回给调用者,使其继续执行其他操作。在那种情况下,任务仍然是异步完成的,就像您曾经使用Wait()和阻塞线程一样,但是现在您当前的线程也有机会做其他事情了。

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

恕我直言,担心任务是否异步是没有意义的。无论如何,您的代码都应相同。而是将任务视为“承诺”,以便在将来的某个时候提供结果。确实,在其他编程环境中,经常使用“承诺”和“未来”这两个词代替“任务”来表示同一件事。有时,这个诺言会立即兑现,有时要花一些时间,但对您而言,发生的情况并不重要。重要的是诺言本身,而不是诺言将如何或准确地兑现。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章