3

次のコードがスレッド セーフかどうかを確認したい: Save1 と Save2 が同時に実行されるとします。データコンテキストのスレッドセーフに問題はありますか?

public class Test1()
{
    private void Save1()
    {        
        using(TestLinqToSQL obj = new TestLinqToSQL())
        {        
             obj.SaveRecord(new Client (){Id = 1, Name = "John Doe");
        }
    }

    private void Save2()
    {        
         using(TestLinqToSQL obj = new TestLinqToSQL())
         {        
             obj.SaveRecord(new Client (){Id = 2, Name = "Mike Tyson");
         }
    }         
}



public class TestLinqToSQL : IDisposable
{
    public void SaveRecord(Client newClient)
    {
        using(ClientDatacontext cont = new ClientDatacontext())
        {
            cont.InsertRecord(newClient);
        }        
    }
}

前もって感謝します

4

2 に答える 2

6

この場合、各メソッドが新しいインスタンスを作成する結果になるため、各スレッドが個別のDataContextインスタンスを取得するため、問題はありません。インスタンスメソッドはスレッドセーフではないため、DataContextがスレッド間で共有されている場合は、問題が発生します。MSDNを参照してください。

于 2012-10-23T19:14:28.790 に答える
1

スレッドセーフは、コンテキストがなければ意味がありません。許容できるものと許容できないものについて、より詳細に説明する必要があります。特定のケースでは、メソッドごとに個別のデータコンテキストがあるため、挿入の1つが別の挿入の「途中」にあること、または他の方法でそれらの1つが完全に失敗することを心配する必要はありません共有リソースへの非同期アクセスの結果として (データ コンテキストがスレッド間で共有されている場合、これは問題になる可能性があります)。

ただし、挿入の順序は完全に不定です。これらの操作の順序が重要な場合、それは「スレッドセーフではありません」。

さらに、「トランザクション」を構成する複数の操作を実行していた場合、スレッド セーフをどのように定義するかによって、「スレッド セーフ」になる場合とそうでない場合があります。他のメソッドの挿入の前または後に (lock確実に a を明示的に追加しない限り)。

于 2012-10-23T19:35:04.760 に答える