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的错误分别不一致?我怎样才能实现我的程序能够识别"真正的工作状态"?
确保您的存储过程不打印任何内容并且没有计数报告 ( 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)