SQL Server2008:BeginExecuteNonQuery/EndExecuteNonQuery问题

Elm*_*mex 5 .net c# t-sql sql-server

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

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

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

Rem*_*anu 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';
   }
}
Run Code Online (Sandbox Code Playgroud)