异步编程是一种在后台调用长时间运行的方法的技术,以便UI线程保持响应。它应该在调用Web服务或数据库查询或任何I / O绑定操作时使用。当异步方法完成时,它将结果返回给主线程。这样,程序的主线程不必等待I / O绑定操作的结果,并继续执行而不阻塞/冻结UI。没关系。
据我所知,异步方法在后台工作线程上执行。运行时可以从线程池中获取线程,也可以为其执行创建一个全新的线程。
但是我在很多帖子中都读到异步操作可以在单独的线程上执行,也可以不使用任何线程。现在我很困惑。
1)您能帮助澄清异步操作不会使用线程的情况吗?
2)处理器内核在异步操作中的作用是什么?
3)它与多线程有何不同?我知道多线程与计算绑定操作一起使用的一件事。
请帮忙。
答案 0 :(得分:5)
IO (假设通过网络进行数据库操作)是这三者的一个很好的例子:
你基本上只是在IO操作完成时注册操作系统最终会调用的回调(可能是在新创建的线程上)。没有线程坐着等待 - 复活将由硬件事件触发(或至少通过操作系统进程通常在用户空间之外)
它可能没有(见1)
在多线程中你使用多个线程(你的后台线程)并且有一个人可能闲置在那里什么也不做(但是用尽系统资源) - 如果你拥有<这当然是不同的/ strong>要计算的东西(所以线程没有空闲等待外部结果) - 使用后台工作者线程是有意义的
答案 1 :(得分:1)
异步操作实际上并不意味着关于如何处理它们的任何事情,只是他们希望选择稍后再回复您的结果。举例来说:
WebBrowser
中的导航。答案 2 :(得分:0)
Asynchronity并没有提及有关线程的任何信息。它有关于某种回调的问题,这些回调将在&#34; statemachine&#34; (不是很正确,但你可以把它想象成事件)。异步不会引发线程,也不会显着分配系统资源。您可以根据需要运行任意数量的异步方法。
线程确实对您的系统有明显的影响,您可以拥有一个拥抱但数量有限的数字。
Io操作主要与其他控制器(HDD,NIC,...)相关。如果您创建线程,现在发生的是您的应用程序中没有任何操作的线程等待控制器完成。在像Carsten和Jeffrey已经提到过的异步中,你只是得到某种回调机制,所以你的线程继续做其他工作,方法等。
还要记住,每个线程都需要资源(RAM,性能,处理垃圾收集变得更糟,......),甚至可能在异常中出现(OutOfMemoryException ...)
那么什么时候使用Threads?绝对只有你确实需要它。如果有异步api使用它,除非你有非常重要的理由不使用它。 在过去的几天里,异步api真的很痛苦,这就是为什么许多人在需要异步时才使用线程。
例如,node.js完全拒绝使用mulptile线程!
如果您处理多个请求,例如在服务/网站中,总是有工作要做,这一点尤为重要。还有一个关于此的简短webcast with Jeffrey Richter,这有助于我理解
另请查看此MSDN article PS:作为副作用源代码,async和await往往更具可读性