存储过程没有完成,但IAsyncResult.IsCompleted是" true"

时间:2015-03-29 03:08:46

标签: c# .net sql-server sqlcommand iasyncresult

我认为这是一个简单的程序,供最终用户运行存储过程,这可能需要相当长的时间才能运行。我以为我能够使用异步连接,调用Begin / EndExecuteNonQuery,并有一个计时器让用户知道它仍然在运行。到目前为止,非常好。

如果某个参数为true,则调用的存储过程将在最后执行另一个存储过程。看来,当这个二次调用发生时,IsCompleted变为" true"即使它没有,程序然后在EndExecuteNonQuery上阻塞,直到第二个SP结束。虽然我不确定,但我想这是因为立即的SQL进程完成了(因为它没有更多的事情要做,EXEC调用是最后一行)但是一个子进程保留了打电话。

如何判断SP是否已完成?我认为我并不完全理解IAsyncResult.IsCompleted;我的印象是,当电话完全完成时,它变为true,但是该链接中的以下声明让我不这么认为:

  

当此属性为true时,您可以认为丢弃任何属性是安全的   您分配供异步操作使用的资源。

所以它可能按预期工作,因为我可以安全地丢弃资源,即使完整的SP没有实际完成。如果是这样的话,有没有办法知道什么时候完全完成了?我考虑过在另一个帖子(ExecuteNonQuery?)中使用正常的BackgroundWorker,但是我想确定我没有遗漏{{1}的内容} / BeginXxx首先。

我也开放了一种丢弃SqlCommand的方法,因此程序可以在不等待SP的情况下退出,因为第一个SP对于最终用户来说是唯一真正重要的东西。

使用.Net 4,MSSQL 2008 R2。


相关代码:

EndXxx

1 个答案:

答案 0 :(得分:0)

如果您使用BeginExecuteNonQuery,则代码不会等待查询执行,然后继续...它将标记为异步调用已完成。

如您所说,如果您希望在后台线程中执行存储过程,则可以使用单独的BackGroundWorker来执行存储过程。

参考this