【问题标题】:Thread vs begininvoke vs async线程 vs begininvoke vs async
【发布时间】:2013-10-29 00:06:25
【问题描述】:

我是线程和异步编程的新手。我正在尝试学习这些概念,到目前为止我理解它,但有一个问题要问。

假设我想调用一个名为 GetAllUsers() 的方法,该方法需要很长时间才能执行,但它不会阻塞资源并保持 UI 响应。所以,我的理解是它可以通过 3 种方式来完成(请让我知道这些是正确的还是我完全弄错了):-

1) 线程:我可以生成一个新线程并将 GetAllUsers 方法作为线程启动。这将在另一个线程上开始执行该方法,使我的 ui 保持响应,并且当调用完成时,我可以使用路由技术来更新 UI 控件,即 InvokeRequired。我的理解正确吗?

或者

2) 异步委托:我可以创建一个委托。创建它的一个新实例并将其指向方法 GetAllUsers。然后使用 BeginInvoke 方法。引擎盖下的 BeginInvoke 将产生一个新线程并运行我的方法以保持 UI 响应。当调用完成时,回调方法将被调用,并再次使用路由技术更新GUI线程上的控件。我的理解正确吗?

或者

3) Async/Await:将外部方法标记为异步,将对方法 GetAllUsers 的调用标记为等待。这也将保持 UI 响应,因为正在运行的线程可以跳出并做一些其他工作,直到对这个慢速方法的调用完成。我的理解正确吗?

现在,问题是 - 如果您阅读下面链接中的第 2 段,它表示 async/await 不会导致创建额外的线程。那么 async/await 如何在不创建任何额外线程的情况下设法提供与上述第一个 2solution 相同的输出。解决方案 1 和 2 将导致多线程,但异步解决方案不会。 async/await 在底层是如何工作的?

http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx#BKMK_Threads

【问题讨论】:

    标签: multithreading delegates async-await


    【解决方案1】:

    我的理解正确吗?

    是的,你的理解是正确的。

    现在,问题是 - 如果您阅读下面链接中的第 2 段,它表示 async/await 不会导致创建额外的线程。那么 async/await 如何在不创建任何额外线程的情况下提供与上述第一个 2 解决方案相同的输出

    async 修饰符和await 运算符不会必然创建新线程。执行异步的实际机制由您调用await 的类型处理。如果你使用await Task.Run(() => YourMethod());,那么Task.Run确实使用线程池线程来执行操作。

    但是,如果您可以重新设计您的方法以便 GetAllUsers 使用异步 IO 调用而不是线程,那么 await 将不需要使用线程来实现异步。例如,如果GetAllUsers 大部分时间都在等待从服务器下载,则使用异步 Web API 将允许您在不使用额外线程的情况下使该方法异步。

    在这种情况下,即使您必须将Task.Runawait 一起使用,这里也有一个很好的优势——您可以修改您的方法以使用await,并且不会弄乱它的逻辑控制流,保持异常处理干净,不必担心使用 BeginInvoke 推回 UI 线程 - 使用 await,所有“混乱”都为您处理,您的代码可以保持非常接近原始代码,非异步代码。

    【讨论】:

    • Hrm... 为什么在这里投反对票?
    猜你喜欢
    • 1970-01-01
    • 2020-08-07
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2021-08-30
    • 2014-08-30
    • 2019-05-10
    相关资源
    最近更新 更多