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

C# 为什么sqlCommand.EndExecuteNonQuery()被阻止?,c#,sql-server-2008,deadlock,C#,Sql Server 2008,Deadlock,我有一个C#应用程序,它连接到SQL Server 2008R2,连接字符串Asynchronous Processing=true和MultipleActiveResultSets=True 应用程序有多个线程,每个线程都打开自己的连接以访问数据库 大部分时间应用程序都在工作,但偶尔会有一些线程在以下代码处被阻塞: IAsyncResult asyncResult = sqlCommand.BeginExecuteNonQuery(); int rowsAffected = sqlComman

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

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

大部分时间应用程序都在工作,但偶尔会有一些线程在以下代码处被阻塞:

IAsyncResult asyncResult = sqlCommand.BeginExecuteNonQuery();
int rowsAffected = sqlCommand.EndExecuteNonQuery(asyncResult);
sqlCommand.EndExecuteNonQuery()
永远不会返回或超时

我检查stacktrace:

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

这段代码似乎毫无意义,但您应该检查asyncResult对象上的IsCompleted标志。如果IsCompleted为false,则调用EndExecuteNonQuery将导致阻塞。

这段代码似乎没有意义,但您应该检查asyncResult对象上的IsCompleted标志。如果IsCompleted为false,则调用EndExecuteNonQuery将导致阻塞。

您知道,通过调用BeginXyz,然后立即调用EndXyz,基本上与同步Xyz调用相同?感谢您指出这一点,这是正确的。我必须看看代码的历史,看看为什么会这样。否则,我将把它改为sqlCommand.ExecuteNonQuery(),您知道,通过调用BeginXyz,然后立即调用EndXyz,基本上与同步Xyz调用相同吗?谢谢您指出这一点,这是正确的。我必须看看代码的历史,看看为什么会这样。否则我将把它改为sqlCommand.ExecuteNonQuery(),我想你是对的。我只是检查API,我应该检查IsCompleted。我需要对此进行测试,因为此问题的发生率不足以重现此问题。我检查了文档,调用EndExecuteNonQuery将被阻止,直到操作完成:。在一个MS示例中,它不检查IsComplete。所以我不认为这是问题的原因。正如@Jon所指出的,这段代码无论如何都是同步的,所以我会修改它,看看它是否解决了问题。我认为你是对的。我只是检查API,我应该检查IsCompleted。我需要对此进行测试,因为此问题的发生率不足以重现此问题。我检查了文档,调用EndExecuteNonQuery将被阻止,直到操作完成:。在一个MS示例中,它不检查IsComplete。所以我不认为这是问题的原因。正如@Jon指出的,这段代码无论如何都是同步的,所以我将对它进行更改,看看它是否解决了问题。