Multithreading 线程与begininvoke与异步

Multithreading 线程与begininvoke与异步,multithreading,delegates,async-await,Multithreading,Delegates,Async Await,我不熟悉线程和异步编程。我正在努力学习这些概念,到目前为止我理解它,但有一个问题要问 假设我想调用一个名为GetAllUsers()的方法,该方法需要很长时间才能执行,不会阻塞资源并保持UI响应。因此,我的理解是,可以通过3种方式完成(请让我知道这些方法是否正确,或者我是否完全弄错了):- 1) 线程:我可以生成一个新线程,并将GetAllUsers方法作为线程开始。这将在另一个线程上开始执行该方法,使我的ui保持响应,当调用完成时,我可以使用路由技术来更新ui控件,即InvokeRequire

我不熟悉线程和异步编程。我正在努力学习这些概念,到目前为止我理解它,但有一个问题要问

假设我想调用一个名为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解决方案相同的输出呢

async
修饰符和
await
操作符不一定创建新线程。执行异步的实际机制由调用
wait
的类型处理。如果使用
wait Task.Run(()=>YourMethod())
,然后
任务。Run
使用线程池线程执行操作

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


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

Hrm。。。为什么要在这里投票?