2009-04-30 15 views
1

私はmutithreadされる必要があるプロジェクトを継承しました。ワーカースレッドで使用される3つの主要なクラスがあります。マルチスレッドアプリケーションでクラス変数を使用するのは悪いですか?

ベースクラス - クラスレベルのSqlDataAdapterとDataTableを持っています。 INHERITED CLASS ONE - 継承されたSqlDataAdapterおよびDataTableを使用します。 INHERITED CLASS TWO - 継承されたSqlDataAdapterとDataTableを使用します。

すべてのことがうまく機能しますが、同時に2人のユーザーしかテストしません。

SqlDataAdapterとDataTableをクラスレベルの変数にするのは悪い考えですか?

更新 残念ながら、SqlDataAdapterはSqlTableAdapterではありません。言語はC#です。 SqlDataAdapterとDataTableは、System.Data.SqlClient名前空間にあります。ここで

は、基底クラスの一部である:

public abstract class BaseSync 
{ 
    #region Variables 
    internal SqlDataAdapter stageDataAdapter; 
    internal DataTable stageDataTable; 
    #endregion //Variables 
} 

第二部

すべての派生クラスを使用してシングルトンのユーティリティクラスもあります。それが問題を引き起こすかどうかはわかりません。

public class Utility 
{ 
    private static readonly Utility _utility= new Utility(); 

    private Utility() 
    { } 

    public static Utility GetUtility() 
    { 
     return _utility; 
    } 

    public int GetAutoNumber(string tablename, string fieldname, string siteId) 
    { 
     string _tablename = tablename; 
     string _fieldname = fieldname; 
     ... 
    } 

    internal MissingInfo NormalizeRow(DataRow dataRow) 
    { 

     MissingInfo retVal = MissingInfo.None; 

     //Num 
     if (dataRow["Num"] == DBNull.Value) 
     { 
      retVal =MissingInfo.Num; 
      dataRow["Num"] = 1; 
     } 
     ... 
    } 
} 
+0

スレッドの安全性またはSQLTableAadaptorとDataTableの知識がなくても、言うことはできません。 –

+0

@ NitroxDM、それはちょうど私ですが、あなたはあなたの質問のどこででもあなたが使っている言語について言及しましたか? SQLTableAdapterはVB.NetまたはC#または他の言語の機能ですか?言語は答えに違いを生むかもしれません。 –

答えて

3

これはオブジェクトのアクセスレベルによって異なります。それらが静的でない限り(VB.NETで共有)それぞれのスレッドがオブジェクトの独自のインスタンスを持っている限り、オブジェクト内にそれらを置くのがよいでしょう。

興味深い状況になるのは、すべてのインスタンスで共有される静的メンバーです。

私はコードを見る必要があります。

2

同期化なしで異なるスレッドによって変数が変更されている場合は、常にという悪い考えがあります。

この場合でも、あなたは言及しません。スレッドを作成する場合は、自分が行っていることを計画して確認する必要があります。

1
あなたは常にマルチスレッドでの非定数オブジェクトを共有し、同期を行うことを検討すべきである

は、そうでない場合、あなたは、...いつか

あなたはそれをクラス変数を作りたいのであれば、それはOKですがめちゃくちゃに終了しますそのためにいくつかのロック機構を作ることを忘れないでください。

2

変数のルールは、潜在的に変更可能な場所が多いほど、競合状態が発生する可能性が高くなります(特にアプリケーションが進化する場合)。

あなたの質問にはあまり情報がありませんので、特定の回答を提供することは困難です。クラスレベルの変数(公表されている場合)は、しばしばグローバル変数のように扱うことができ、したがってどこからでもアクセス可能であり、腐敗のリスクを高める。

これらのフィールドを非表示にして、クラスレベルの機能を介してアクセスできるようにする方法が考えられます。これらの変数へのアクセスの特定のポイントを作成したので、さらに多くのことを行うことができます。そのオブジェクトへの直接的かつ変更可能な参照をアプリケーションに与えることがないように注意する必要があります。その場合、書き換えが必要になるかもしれませんが、プログラムをより安全にするでしょう。

関連する問題