繁体   English   中英

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

[英]Task is asynchronous or synchronous without async await?

如果我有没有async awaittask ,我的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. 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()创建一个新任务时,它将一个工作人员排队到线程池中,并且它将异步运行。 但是,您也可以从Task.FromResult()方法中获取Task object,该方法通常会同步返回已完成的任务。

在这两个极端之间是诸如async方法之类的东西,有时同步完成,有时不同步完成(例如,从文件或网络读取数据,有时数据已经被缓冲并且可用,而其他时候它直到稍后才可用) .

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

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

您选择让当前线程什么都不做的事实并没有改变您开始的任务的固有异步性质。

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

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

恕我直言,担心任务是否异步是没有意义的。 无论如何,您的代码应该可以正常工作。 相反,将任务视为在未来某个时间提供结果的“承诺”。 事实上,在其他编程环境中,经常使用“promise”和“future”这两个词来代替“task”,来表示同样的事情。 有时 promise 会立即完成,有时需要一段时间,但发生什么对你来说并不重要。 重要的是 promise 本身,而不是如何或确切地保留 promise 的时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM