gpt4 book ai didi

c# - 使用 async-await 进行数据库查询——这如何节省线程?

转载 作者:行者123 更新时间:2023-11-30 13:44:00 24 4
gpt4 key购买 nike

我开始理解如何awaiting 一系列async 方法的概念,这些方法“在底部”有一个硬件任务,比如写入文件(没有线程 https://blog.stephencleary.com/2013/11/there-is-no-thread.html )。但是,如果数据库是本地数据库,await 数据库调用(如 ExecuteQueryAsync)有什么意义呢?由于 SQL Server 需要一个线程来执行查询,这在技术上不是一个 CPU 绑定(bind)任务吗?

最佳答案

您的进程在线程池中的线程数量有限(您可以创建更多线程,但它们在资源方面很昂贵)。当您进行数据库调用时,数据库服务器通常是一个单独的进程,具有自己的一组线程。准备您要求的数据需要时间,因此您可以选择在此期间要做什么:

  • 进入阻塞等待 - Thread.SleepTask.Wait 等。这意味着您在线程 A 上触发数据库请求,然后进入在该线程上等待:线程已分配但被阻塞并且不能用于其他任何事情。当您的数据准备就绪时,您会以某种方式了解它并退出等待,您的代码将继续在线程 A 上运行。

  • 您执行异步等待:触发数据库请求,然后使用回调函数执行 await。该调用被发送到数据库进程,但随后它只是返回(在内部它会记录您的回调函数(延续))。此时,线程 A 是空闲的——您不再使用它,所以它回到池中,可以用于其他用途。数据库服务器使用它自己的线程之一来获取您的数据,但这与您无关 - 现在可以在您自己的应用程序中使用线程 A 来执行某些操作。

    稍后,您的数据准备就绪,您的回调函数在一些线程上被调用——不一定是线程 A,您的代码可以恢复。

异步处理因此释放了您的一个线程一段时间来做其他事情。您不会更快地获取数据 - 准备数据仍然需要 X 毫秒。您得到的是更高效地使用现有线程,并为主要等待而不是计算(即 IO 操作)的操作提供更多并行性。在您的情况下, 大部分时间都在等待 - 处理和计算是由不同的进程完成的。

正如@ErikPhilips 所指出的,Stephen Cleary 的文章值得一读(不只是这篇文章):https://blog.stephencleary.com/2013/11/there-is-no-thread.html

关于c# - 使用 async-await 进行数据库查询——这如何节省线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46957418/

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