1

接続文字列を使用して 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 がセッションをブロックしているかどうかを確認しましたが、ブロックされていません。同じアプリケーションが所有する複数の接続があり、何らかの理由でそれらが互いにブロックされている可能性がありますか?

4

1 に答える 1

1

このコードは無意味に見えますが、asyncResult オブジェクトの IsCompleted フラグを確認する必要があります。IsCompleted が false の場合に EndExecuteNonQuery を呼び出すと、最終的にブロックされます。

于 2013-01-04T17:46:53.353 に答える