2011-07-16 12 views
1

マルチスレッドアプリケーションでクラスのインスタンスを使用することについてもっと明確にしたいと考えています:
異なるスレッドで同じクラスのインスタンスを使用できますか?つまり、は同じクラスの異なるスレッドインスタンスで作成できますか?例えば異なるスレッドで1つのクラスのインスタンスを使用する


私はそのデフォルトコンストラクタ内の接続文字列を取得し、パブリックプロパティを使用して接続文字列が表示されるようクラスDbConnectionHelperを持っている:

public class DbConnectionHelper 
{ 
    string connstring; 

    public DbConnectionHelper() 
    { 
     string userconnstring = Settings.Default.ConnectionString; 
     connstring = GetConnectionString(userconnstring); 
     ... 
    } 

    public string ConnString 
    { 
     get 
     { 
      return connstring; 
     } 
     set 
     { 
      connstring = value; 
     } 
    } 
    ... 

それから私は、リポジトリクラスの数を持っていますEntity Frameworkを使用してデータベースからデータを取得します。これらのリポジトリクラスの中には、UIスレッド内にインスタンスを持つものもあれば、UI以外のスレッドにインスタンスを持つものもあります。

これらのリポジトリクラスはすべて、1つのクラスDbConnectionHelperのインスタンスを作成してConnStringプロパティを読み取ることで接続文字列を取得できますか?同じクラスの

DBConnectionHelper connhelper = new DBConnectionHelper(); 
string conn = connhelper.ConnString; 
+1

簡易回答:はい。クラス/オブジェクトとスレッドの間には関係がありません。スレッドに対してのみコードが実行されます。 –

答えて

3

別々のインスタンスは独立しており、それら全てが共通のオブジェクト(への依存性を持っていない限り、そのようなクラスの静的変数または別のオブジェクトへの参照として、共通のデータを共有しませんすべてまたは少なくともいくつかの場合に同じ)。

あなたのケースでは、これはまったく問題ではありません - 必要なたびにDBConnectionHelperクラスの独立したインスタンスを作成し、接続文字列を作成するためだけに使用します。 複数のスレッドが共有オブジェクトののメソッドを試してアクセスしようとすると、スレッドの安全性について心配する必要があります。

2

はい、別のスレッドでクラスのインスタンスを作成しても問題は発生しません。別のスレッドから静的なクラスやメンバーにアクセスしたり、クラスのインスタンスをスレッド間で共有したりする場合は、もっと複雑になりますが、あなたがしていることは完全に安全です。

エンティティがデータベースからロードされている間は、UIが応答しなくなるため、UIスレッドからEntity Frameworkエンティティをロードしないようにすることができます。これは、バックグラウンドワーカースレッドまたはTaskを使用するのに適しています。

関連する問題