为什么sqlCommand.EndExecuteNonQuery()被阻止?

时间:2013-01-04 17:27:15

标签: c# sql-server-2008 deadlock

我有一个C#应用程序,使用连接字符串Asynchronous Processing=true;MultipleActiveResultSets=True;

连接到SQL Server 2008R2

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

大多数情况下应用程序都可以正常运行,但有时这些线程中的一些被阻止在以下代码中:

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

1 个答案:

答案 0 :(得分:1)

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