SQL Server 2008:BeginExecuteNonQuery / EndExecuteNonQuery问题

时间:2010-08-03 15:41:48

标签: c# .net sql-server tsql

我有存储过程,它会写入特定数据库的备份。我异步地在C#/ Windows Forms应用程序中调用此SP。这是剪辑的代码:

IAsyncResult result = command.BeginExecuteNonQuery();
while (!result.IsCompleted)
{
     System.Threading.Thread.Sleep(1000);
     ...
}
command.EndExecuteNonQuery(result));

一段时间后程序离开循环,因为IsCompleted = true并调用EndExecuteNonQuery。 现在的问题是,作业仍然很忙, EndExecuteNonQuery 被阻止! 这会在几分钟后导致服务器超时。 似乎 IsCompleted 值与 IsCompleted 分别不一致? 我怎样才能实现我的程序识别“真实工作状态”

1 个答案:

答案 0 :(得分:3)

确保您的存储过程不打印任何内容并且没有计数报告(SET NOCOUNT ON)。异步TDS调用在服务器发送的第一个数据包上回调,但此数据包可能是中间结果(如1 row updated中所示),并且在实际完成之前很久就会发生。这很糟糕吗?是。你能做点什么吗?否。

作为旁注,将回调传递给BeginExecute(...)是否效率更高:

// Set form's state to 'executing', 
// eg. Button.Enabled = false; label.Text = 'Executing';
command.BeginExecuteNonQuery((asyncstate)=>
{
   try
   {
      command.EndExecuteNotQuery();
   }
   catch(SqlException ex)
   {
     ...
   } 
   // Reset the form's state to 'Ready'
   Invoke (()=>
   {
     // eg. Button.Enabled = true; label.Text = 'Ready';
   }
}