Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server中的异步处理与.NET异步处理_.net_Sql Server_Asynchronous - Fatal编程技术网

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

SQL Server中的异步处理与.NET异步处理,.net,sql-server,asynchronous,.net,Sql Server,Asynchronous,与.NET异步处理相比,在SQL Server中使用异步处理有什么优势?他们不一样吗?我很难理解在SQL Server中使用异步处理而不是.NET APM有什么好处。我可以轻松地将SQL调用封装在lambda表达式中,并执行BeginInvoke(…) 有人能帮我找出两者的区别和好处吗?从这篇文章中,我引用: 异步处理使 方法立即返回,而不使用 在调用线程上阻塞。这 允许大量的电力和电力供应 多线程处理的灵活性,无需 要求开发人员明确 创建线程或句柄 同步 如果您已经显式地创建了这些线程并处理了

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

有人能帮我找出两者的区别和好处吗?

从这篇文章中,我引用:

异步处理使 方法立即返回,而不使用 在调用线程上阻塞。这 允许大量的电力和电力供应 多线程处理的灵活性,无需 要求开发人员明确 创建线程或句柄 同步

如果您已经显式地创建了这些线程并处理了同步,那么您可能不会发现有太大的区别。

如果您的意思是“为什么要使用数据提供程序
BeginExecute\uuuuuuuuuuuu()/EndExecute\uuuuuuuuuuuuuuuuuuuuu()
方法而不是包装一个普通的
Execute\uuuuuuuuuuuuuuuuuuuu())
在委托中,我怀疑答案是,当他们第一次为ado.net for.net 1.0设计提供程序模型时,在委托中包装某些内容并异步调用它并不是那么简单


其他可能的原因是,这与为原始.Net更新或包装的旧代码的工作方式相匹配,或者内置方法允许您轻松检查任何返回的异常

与.Net异步处理问题(
BeginInvoke(…)
)所有这一切都是为了同步处理代码而旋转线程。5分钟的查询将占用线程5分钟,阻塞(即在约99%的时间内不执行任何操作),而结果在远端计算。压力不足(一次多次查询)这将耗尽线程池,使所有线程都处于阻塞状态。线程池将变得无响应,新的工作请求将在等待线程池启动额外线程时遭受较大的延迟。这不是线程池的预期用途,因为它的设计预期要求它完成的任务是e短寿命和非阻塞


使用Begin/EndAction APM对,可以以非阻塞方式调用相同的操作,并且只有当结果通过IO完成端口返回时,它才作为线程池中的工作项排队。在此期间,没有线程被占用,并且在处理排队响应时,数据可用,这意味着用户可以de不会阻塞IO,并且可以快速完成…更高效地使用线程池,它可以扩展到多个客户端请求,而无需为每个未完成的操作花费线程。

.Net BeginInvoke只是将执行延迟到另一个线程中。这将始终比同步调用慢,并消耗额外的资源使用此方法的唯一原因是释放调用方上下文以继续执行其他操作(例如,将HTTP请求的结果返回给客户端)

当连接上的属性设置为true并且使用SqlCommand的BeginExecute方法时,SqlClient异步方法是真正异步的。SQL命令被发布到网络通信通道,并且在服务器返回结果时调用完成

从可靠性的角度看,虽然这两种方法都不是有用的。它们都依赖于客户端进程,直到调用完成,否则SQLServer会看到客户端断开连接并放弃处理,回滚任何中间工作。ted进行了“异步”支付处理并返回了响应。无法保证提交的工作将实际发生


对于处理需要可靠性保证的情况,解决方案是将服务器上的工作排队,提交,然后继续,依靠SQL server自身的异步处理功能。这种方法即使存在客户端断开连接、ASP进程“回收”、SQL server镜像,也能保证处理g或群集故障转移、硬件灾难恢复,几乎任何您可以抛出的东西,因为它是提交异步处理请求的事务性持久方式。例如,请参阅。

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

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


后一种方法的优点是更具可伸缩性。通过这种方法,您可以同时处理数百或数千个请求,而每次调用一个线程的开销将是极大的。此外,您将非常快地消耗整个ASP.NET线程池(默认情况下最多只有12个线程).

我认为他的意思是“为什么要使用数据提供程序的BeginExecute\uUuUuUu()/EndExecute\uUuUuUuUuUu()”而不是将它们包装在一个委托中。也许.NET团队的MS人员更清楚:PSqlClient的BeginExecute/EndExecute使用异步IO如果连接配置正确,它们不仅仅是一个普通的委托异步调用。