接続文字列を使用して 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)
を 30 秒に設定しsqlCommand.CommandTimeout
ましたが、この問題が時々発生する理由がわかりません。
SQL Server がセッションをブロックしているかどうかを確認しましたが、ブロックされていません。同じアプリケーションが所有する複数の接続があり、何らかの理由でそれらが互いにブロックされている可能性がありますか?