既存のアクティブな接続を再利用しようとするのではなく、リクエストごとに新しい接続を作成することをお勧めします。ある種のクラスメンバーまたは接続への静的参照を使用していると仮定します。代わりに、メソッドスコープにします。
private void RespondingToTcpRequest()
{
using (var connection = new SqlConnection(""))
using (var command = new SqlCommand("", connection))
{
connection.Open();
using (var reader = command.ExecuteReader())
{
// No locks or sharing issues here!
}
}
}
あなたが現在持っているものを示すサンプルコードがあれば、そのアイデアをあなたの状況に適応させることができます.
ロックに関しては、本当にこのルートをたどりたい場合 (真剣に、そうしないでください)、必要なのはロック (基本的な同期プリミティブの 1 つ) だけです。
private static readonly object ReaderLock = new object();
private void RespondingToTcpRequest()
{
lock (ReaderLock)
{
// database connection, command, reader stuff here.
}
}
問題はプロセスローカルであり、lock キーワードで十分であるため、ミューテックスは必ずしも必要ではありません。繰り返しますが、真剣に、しないでください。