我有一个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是否阻止了会话,但是没有。是否可能因为同一个应用程序拥有多个连接,并且它们以某种方式相互阻塞?
答案 0 :(得分:1)
看起来这个代码看起来毫无意义,但你应该检查asyncResult对象上的IsCompleted标志。如果IsCompleted为false,则调用EndExecuteNonQuery将最终阻塞。