1

我有一个使用连接字符串连接到 SQL Server 2008R2 的 C# 应用程序,Asynchronous Processing=true;并且MultipleActiveResultSets=True;

该应用程序有多个线程,每个线程都打开自己的连接来访问数据库。

大多数情况下,应用程序都在工作,但有时其中一些线程在以下代码中被阻塞:

IAsyncResult asyncResult = sqlCommand.BeginExecuteNonQuery();
int rowsAffected = sqlCommand.EndExecuteNonQuery(asyncResult);

sqlCommand.EndExecuteNonQuery()永不返回,或超时。

我检查堆栈跟踪:

Child SP         IP               Call Site
000000000242d608 00000000778618ca [HelperMethodFrame_1OBJ: 000000000242d608] System.Threading.WaitHandle.WaitOneNative(System.Runtime.InteropServices.SafeHandle, UInt32, Boolean, Boolean)
000000000242d740 000007fef795bf64 System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle, Int64, Boolean, Boolean)
000000000242d780 000007fee438bed6 System.Data.SqlClient.SqlCommand.WaitForAsyncResults(System.IAsyncResult)
000000000242d7c0 000007fee438baf1 System.Data.SqlClient.SqlCommand.EndExecuteNonQuery(System.IAsyncResult)

我已将时间设置sqlCommand.CommandTimeout为 30 秒,但我无法弄清楚为什么这个问题偶尔会发生。

我检查了 SQL Server 是否阻止了会话,但没有。是否有可能是因为同一个应用程序拥有多个连接,并且它们以某种方式相互阻塞?

4

1 回答 1

1

看起来这段代码毫无意义,但您应该检查 asyncResult 对象上的 IsCompleted 标志。如果 IsCompleted 为 false,则调用 EndExecuteNonQuery 将最终阻塞。

于 2013-01-04T17:46:53.353 回答