我有一个使用连接字符串连接到 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 是否阻止了会话,但没有。是否有可能是因为同一个应用程序拥有多个连接,并且它们以某种方式相互阻塞?