SQL Server与.NET异步处理中的异步处理

Mar*_*tin 6 .net sql-server asynchronous

在SQL Server中使用异步处理而不是.NET异步处理有什么优势?他们不一样吗?我很难理解在SQL Server中使用异步处理而不是.NET APM的好处是什么.我可以轻松地将一个SQL调用包装在lambda表达式中并执行BeginInvoke(...).

有人可以帮助我两者的区别和好处吗?

spe*_*der 9

.NET异步处理(BeginInvoke(...))的问题在于,所有这一切都是通过分离线程来同步处理代码.一个5分钟的查询将占用一个线程5分钟,阻塞(即在99%的时间内什么都不做),而在远端计算结果.在压力下(一次多次查询),这将耗尽线程池,将所有线程捆绑在阻塞状态.线程池将变得无响应,并且新的工作请求将遭受等待线程池启动额外线程的大延迟.这不是线程池的预期用途,因为它的设计期望它要求完成的任务是短暂的和非阻塞的.

使用Begin/EndAction APM对,可以以非阻塞方式调用相同的操作,并且只有当结果通过IO完成端口返回时才会将其排队为线程池中的工作项.在过渡期间,你的所有线程都没有被束缚,并且在处理排队响应时,数据可用意味着用户代码不会阻塞IO,并且可以快速完成...更有效地使用线程池可以扩展到更多客户端请求,而不需要每个未完成操作的线程成本.


Ric*_*kNZ 5

如前面的答案所述,BeginInvoke使用.NET线程.同样重要的是,该线程来自ASP.NET线程池,因此它与客户竞争非常有限的线程资源.同样如此ThreadPool.QueueUserWorkItem().

SqlClient异步调用需要SqlConnection启用async = true 的异步调用.该模式需要更多的网络开销(这是默认情况下未启用的原因),但它不会消耗.NET线程池中的线程.相反,它使用异步I/O.

后一种方法的优点是它更具可扩展性.您可以通过这种方式处理数百或数千个并发请求,其中每次调用线程的开销将是极端的.另外,您将非常快速地使用整个ASP.NET线程池(默认情况下它最多只有12个线程).