使用BeginNonExecuteQuery()的消防和遗忘模式

时间:2011-11-16 06:13:21

标签: c# .net sql-server asynchronous

目的: 我正在进行负载测试,我需要让Sql Server始终消耗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(); 工作?或者会再次调用回调?

1 个答案:

答案 0 :(得分:1)

Cancel的主要示例似乎是基于读者的查询。我不知道它是否设计用于异步模式。

如果它不起作用,我怀疑在这里做你想要的唯一支持的方法是使用命令超时 - 所以在(比方说)30秒之后超时并且如果需要重新发出它。奇怪的是,我怀疑设计师花了很长时间考虑使用例如“我需要将CPU保持在100%并永不退出”......