我是线程和异步编程的新手。我正在尝试学习这些概念,到目前为止我理解它,但有一个问题要问。
假设我想调用一个名为 GetAllUsers() 的方法,该方法需要很长时间才能执行,但它不会阻塞资源并保持 UI 响应。所以,我的理解是它可以通过 3 种方式完成(请让我知道这些是正确的还是我完全弄错了):-
1) 线程:我可以生成一个新线程并将 GetAllUsers 方法作为线程启动。这将在不同的线程上开始执行该方法,使我的 ui 保持响应,当调用完成时,我可以使用路由技术更新 UI 控件,即 InvokeRequired。我的理解正确吗?
或者
2)异步委托:我可以创建一个委托。创建它的一个新实例并将其指向方法 GetAllUsers。然后使用 BeginInvoke 方法。引擎盖下的 BeginInvoke 将产生一个新线程并运行我的方法来保持 UI 响应。调用完成后,将调用回调方法,并再次使用路由技术更新 GUI 线程上的控件。我的理解正确吗?
或者
3)Async/Await:将外部方法标记为async,将对GetAllUsers方法的调用标记为await。这也将使 UI 保持响应,因为正在运行它的线程可以跳出并做一些其他工作,直到对这个慢速方法的调用完成。我的理解正确吗?
现在,问题是 - 如果您阅读下面链接上的第二段,它表示 async/await 不会导致创建额外的线程。那么 async/await 如何在不创建任何额外线程的情况下提供与上述第一个 2solution 相同的输出。解决方案 1 和 2 将导致多线程,但异步解决方案不会。async/await 如何在幕后工作。?
http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx#BKMK_Threads