最后一次.是await与线程一起工作

本文关键字:一起 工作 线程 await 最后一次 | 更新日期: 2023-09-27 18:05:05

我以前看到过一些类似的问题,只是想澄清一下。

在本文中,对于异步调用,表示"没有线程"

然而,在另一个例子中,它说

在这里,我们运行回调来更新的Texttextbox1上的任意线程,无论任务并行库(TPL)实现的ContinueWith碰巧放了它。

另外,在某些情况下,当我在我的项目中调用ContinueWith时,我也得到了"跨线程访问异常。

那么,谁是对的?

答案:感谢我的朋友。在仔细阅读了第一篇文章之后,我发现了这个地方

因此,我们看到在请求执行期间没有线程。当请求完成时,各种线程被"借用"或拥有工作短暂地排队给他们。这个功通常是a的数量级毫秒左右(例如,线程池上运行的APC)降低到a微秒左右(例如,ISR)。但是没有线索阻塞,正在等待请求完成。

最后一次.是await与线程一起工作

都是。当你在CPU上运行代码时,总是有一个线程在运行它。问题是当你没有代码可运行时,比如当你在等待一个IO操作完成时,会发生什么。

如果你使用async await,你应该没有线程空闲等待操作完成,只有完成后,一个线程将被给予(通常由Thread Pool)继续在CPU上运行代码。

当你不使用async-await(或Begin-End等不同的异步范式)时,你将在整个操作中保持一个线程,即使在它的IO部分,这是对资源的浪费。


需要补充的是,尽管大多数异步示例都考虑到IO操作,但情况并非总是如此。在某些情况下,异步处理CPU受限的操作(在整个操作过程中保持一个线程)是合理的。