【问题标题】:Last time. Is await working with threads?上次。等待与线程一起工作吗?
【发布时间】:2014-05-26 13:00:34
【问题描述】:

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

this article 中,表示“没有线程” 用于异步调用。

不过,in another one,据说

然而,在这里,我们正在运行回调来更新文本 textBox1 在某个任意线程上,无论任务并行库在哪里 (TPL) ContinueWith 的实现碰巧把它说出来了。

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

那么,谁是对的?

回答:感谢 i3arnon。仔细阅读第一篇文章后,我发现了这个地方

因此,我们看到在请求运行时没有线程。 当请求完成时,各种线程被“借用”或拥有 工作在他们面前短暂地排队。这项工作通常在 毫秒左右(例如,在线程池上运行的 APC)下降到 微秒左右(例如,ISR)。但是没有线程是 被阻止,只是等待该请求完成。

【问题讨论】:

    标签: c# asynchronous synchronization task async-await


    【解决方案1】:

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

    如果你使用async await,你应该不会有线程空闲等待该操作完成,只有它完成后才会给出一个线程(通常由Thread Pool ) 以继续在您的 CPU 上运行代码。

    当您不使用 async-await(或不同的异步范例,如 Begin-End)时,您将在操作整个中持有一个线程,即使在它的 IO 部分也是如此,这是一个浪费资源。


    重要的是要补充一点,尽管大多数异步示例都涉及 IO 操作,但情况并非总是如此。在某些情况下,异步处理 CPU 绑定操作(在整个操作中确实持有一个线程)是合理的。

    【讨论】:

    • 但是.. 我认为默认情况下await 使用线程,这对 IO 很有用。如果我有一些计算要完成,我将使用await Task.Run() 在另一个线程中进行异步计算。
    • @VitaliiVasylenko await 本身并没有做太多。它仅将下一行代码注册为延续。这意味着您没有使用线程您正在等待,但您确实需要一个线程之后您完成等待来执行其余的代码。
    • @VitaliiVasylenko Tash.Run 将启动一个 CPU 绑定操作,该操作本身将持有一个线程。但等待它不会。这就是我在上一部分中提到的异步 CPU 绑定操作。
    • @VitaliiVasylenko 在获得 IO 操作已完成的信号和将相关任务标记为已完成的结果之间一些代码。也许不是很多,但你需要一些线程来运行它。
    • 非常感谢,现在我知道了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2019-12-12
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多