我有存储过程,它会写入特定数据库的备份。我异步地在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 分别不一致? 我怎样才能实现我的程序识别“真实工作状态”?
答案 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';
}
}