Multithreading 线程与begininvoke与异步
我不熟悉线程和异步编程。我正在努力学习这些概念,到目前为止我理解它,但有一个问题要问 假设我想调用一个名为GetAllUsers()的方法,该方法需要很长时间才能执行,不会阻塞资源并保持UI响应。因此,我的理解是,可以通过3种方式完成(请让我知道这些方法是否正确,或者我是否完全弄错了):- 1) 线程:我可以生成一个新线程,并将GetAllUsers方法作为线程开始。这将在另一个线程上开始执行该方法,使我的ui保持响应,当调用完成时,我可以使用路由技术来更新ui控件,即InvokeRequired。我的理解正确吗 或 2) 异步委托:我可以创建一个委托。创建它的新实例并将其指向方法GetAllUsers。然后使用BeginInvoke方法。引擎盖下的BeginInvoke将生成一个新线程,并运行我的方法以保持UI的响应性。当调用完成时,将调用回调方法,并再次使用路由技术更新GUI线程上的控件。我的理解正确吗 或 3) Async/Await:将外部方法标记为Async,并将对方法GetAllUsers的调用标记为Await。这还将保持UI的响应性,因为运行它的线程可以跳出并执行一些其他工作,直到对这个慢方法的调用完成。我的理解正确吗 现在,问题是-如果您阅读了下面链接的第2段,它说async/await不会导致创建额外的线程。那么,async/await如何在不创建任何额外线程的情况下提供与上述第一个2解决方案相同的输出呢。解决方案1和2将导致多线程,但异步解决方案不会。async/await如何在引擎盖下工作 我的理解正确吗 是的,你的理解是正确的 现在,问题是-如果您阅读了下面链接的第2段,它说async/await不会导致创建额外的线程。那么,async/await如何在不创建任何额外线程的情况下提供与上述第一个2解决方案相同的输出呢Multithreading 线程与begininvoke与异步,multithreading,delegates,async-await,Multithreading,Delegates,Async Await,我不熟悉线程和异步编程。我正在努力学习这些概念,到目前为止我理解它,但有一个问题要问 假设我想调用一个名为GetAllUsers()的方法,该方法需要很长时间才能执行,不会阻塞资源并保持UI响应。因此,我的理解是,可以通过3种方式完成(请让我知道这些方法是否正确,或者我是否完全弄错了):- 1) 线程:我可以生成一个新线程,并将GetAllUsers方法作为线程开始。这将在另一个线程上开始执行该方法,使我的ui保持响应,当调用完成时,我可以使用路由技术来更新ui控件,即InvokeRequire
async
修饰符和await
操作符不一定创建新线程。执行异步的实际机制由调用wait
的类型处理。如果使用wait Task.Run(()=>YourMethod())
,然后任务。Run
使用线程池线程执行操作
但是,如果您可以修改方法,使GetAllUsers
使用异步IO调用而不是线程,那么await
将不需要使用线程来实现异步。例如,如果GetAllUsers
大部分时间都在等待从服务器下载,那么使用异步web API将允许您在不使用额外线程的情况下使该方法异步
在这种情况下,即使您必须使用
Task.Run
和await
,这里也有一个很好的优势-您可以重新编写您的方法来使用await
,而不会打乱它的逻辑控制流,保持异常处理干净,而且不必担心使用BeginInvoke
推回UI线程-使用wait
,所有这些“混乱”都会为您处理,您的代码可以非常接近原始的非异步代码。Hrm。。。为什么要在这里投票?