gpt4 book ai didi

multithreading - 线程vs Begininvoke vs异步

转载 作者:行者123 更新时间:2023-12-04 04:30:10 25 4
gpt4 key购买 nike

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

可以说我想调用一个名为GetAllUsers()的方法,该方法需要很长时间才能执行,因此它不会阻塞资源并保持UI响应。因此,我的理解是,可以通过3种方式完成此操作(请让我知道这些操作是否正确或我完全理解错误):

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

或者

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

或者

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

现在,问题是-如果您阅读下面链接上的第二段,则说明async/await不会导致创建其他线程。因此,异步/等待如何在不创建任何其他线程的情况下设法提供与上述第一个2解决方案相同的输出。解决方案1和2将导致多线程,但异步解决方案将不会。异步/等待如何在后台运行?

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

最佳答案

Is my understanding correct?



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

Now, the question is - If you read the 2nd para on the link below, it says that async/await does not cause additional threads to be created. So how does the async/await manages to give the same output as the first 2solution above without creating any additional threads


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

但是,如果可以重做方法,以便 GetAllUsers使用异步IO调用而不是线程,则 await将不需要使用线程异步。例如,如果 GetAllUsers将大部分时间都花在等待从服务器上下载,则使用异步Web API将使您可以使该方法异步,而无需使用额外的线程。

在这种情况下,即使您必须将 Task.Runawait结合使用,在这里也有一个很大的优势-您可以重新使用 await的方法,而不会弄乱其逻辑控制流程,保持异常处理的清洁,而不必担心使用 BeginInvoke推回UI线程-使用 await,所有“困惑”都将为您处理,并且您的代码可以与原始的非异步代码保持非常接近的状态。

关于multithreading - 线程vs Begininvoke vs异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19647369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com