使用BeginNonExecuteQuery()激发并忘记模式
本文关键字:忘记 模式 BeginNonExecuteQuery 使用 | 更新日期: 2023-09-27 18:15:02
目的:我正在进行一个负载测试,在这个测试中,我需要让SqlServer一直消耗100%的CPU。
方法:
- 我建立了一个异步连接,运行BeginNonExecuteQuery((并注册一个回调。查询是一个简单的while(1(,它使cpu保持繁忙,并且永远不会返回
问题:
-
有时sql命令会被中断并调用回调。在这种情况下,我需要重试sql命令。在回调中,我执行以下操作:
try { // If execution is incomplete, cancel the sqlCommand if (!result.IsCompleted) { command.Cancel(); } command.EndExecuteNonQuery(result); } catch(SqlException ex) {} finally { // if connection closed, reopen // retry sql command anyway }
这是最干净的方法吗?我读到Cancel((不适用于异步命令。并且EndExecuteNonQuery((会阻塞,直到命令完成执行,在我的情况下,从我的运行来看似乎是这样。此外,重试逻辑有意义吗?
- 同样,我希望在超时后中途自动取消异步命令。会打电话
command.Cancel(); EndNonExecuteQuery();
工作还是会再次调用回调
Cancel
的主要示例似乎是基于阅读器的查询。我不知道它是否设计用于异步模式。
如果它不起作用,我怀疑唯一受支持的方法是使用命令超时——所以在(比如(30秒后超时,如果需要,可以重新发出命令。奇怪的是,我怀疑设计者是否花了很长时间来考虑诸如"我需要将CPU保持在100%,并且永远不会退出"之类的用例。。。