0

私が取り組んでいるプロジェクトでは、クラスを特異点として実装しています。このクラスは、システムが実行されているステージ (Dev、Test、Production など) を検出し、それに応じて特定の値を返すことを担当します。これにより、開発チームはそれらの値を使用するたびにステージング設定の処理について心配する必要がなくなります。さらに、別のステージにいるふりをするために、現在のステージをオーバーライドすることができます。

私の懸念は、マルチスレッドが関係しているときに特異点がどのように動作するかを処理する必要があります。以下のコードは、使用される基本的なセットアップの概要を示しています。

私の質問は、 program と program2 が同時に異なるスレッドで実行できる場合、 OverrideStage() 関数 (インスタンスのプライベート変数を変更する) は、他のプログラムの予想される動作に干渉しますか?

例:

1) プログラムが開始され、ステージが DEV に設定されます

2) 別のスレッドで、Program2 が開始され、ステージが PRODUCTION に設定されます

3) プログラムに戻り、値を取得してみます。値は DEV にありますか、それとも PRODUCTION にありますか?

namespace TESTING
{

class Program
{
    static void Run()
    {

        Staging stage = Staging.Instance;

        stage.OverrideStage(Staging.DEV);
            SqlConnection connDev = new SqlConnection(stage.ConnectionString("example")); // Connection to development database
            // Do Stuff
        stage.EndOverride();
            SqlConnection connBackToAuto = new SqlConnection(stage.ConnectionString("example")); // Connection to detected stage database
    }
}

class Program2
{             
    static void Run()
    {
        Staging s = Staging.Instance;
        s.OverrideStage(Staging.PRODUCTION);
            SqlConnection connDev = new SqlConnection(s.ConnectionString("example")); // Connection to production database
            // Do stuff
        s.EndOverride();
    }
}

} // End namespace

質問は次のように単純化できると思います。

とステージはステージングの同じインスタンスですか?

4

1 に答える 1

1

あなたのアプリケーションが 2 つの主要なエントリ ポイントを持つことができるとは思えません... 複数のエントリ ポイントを指定しない限り、あなたが説明していることは実現不可能です。

ここで、実行可能であれば (つまり、複数のエントリ ポイントを指定した場合)、

モードを変更しようとするとStaging、両方のプログラム インスタンスのモードが更新されます。

それでは、あなたの例を見てみましょう:

1) Program starts, sets stage to DEV    
2) On another thread, Program2 starts, sets stage to PRODUCTION
3) Back in Program, try to get a value, will the value be in DEV or PRODUCTION?

ほとんどの場合、値は になりますがPRODUCTION、スレッドの開始方法によってはそうではない場合があります。両方のスレッドが比較的迅速に次々と開始される場合、2 つのスレッド間でいつコンテキスト スイッチが発生したかによって、ステージがDEVまたはになる可能性があるため、複雑になる可能性があります。PRODUCTION

アップデート 1.0

Mainメソッドをメソッドに置き換えたので、複数のエントリ ポイントを取り消しRunます。

アップデート 2.0

シングルトンにするかシングルトンにしないか

主に、プログラムには通常、アプリケーションのMainエントリポイントが含まれているため、説明している状況は非常に混乱しています。DEV通常の状況では、プログラムはまたはPRODUCTIONモードで実行されることが予想されます。複数のプログラム インスタンスを別々のスレッドで異なるモードで実行すると、非常に混乱します!!! 誰もがそれをやりたがる現実的な例は思いつきません。

そのようなあいまいな例があったとしましょう: あなたの最善の策は、各プログラムにグローバル (シングルトン) ステージング状態ではなく、独自の内部ステージング状態を提供することです。これにより、プログラムの複数のインスタンスを複数のスレッドで開始でき、それぞれが互いに独立して実行されることが保証されます。一般に、スレッド間での共有はできるだけ少なくしたいと考えています。一部の人々は、それをシェアード ナッシング アーキテクチャと呼んでいます。

ステージングモードとは?

シングルトンのアプローチを取ると、この質問に答えるのが非常に難しくなります。

  • 実行中のスレッドが初期化されるまでProgram2待機することを保証する方法がある場合Program(ある種のスレッド シグナル メカニズムを介して)、モードが になることが保証されますPRODUCTION
  • スレッド シグナル メカニズムがない場合、モードは、多くの問題に応じてDEVまたはのいずれかになります。PRODUCTION

実際、Staging異なる名前空間に個別のクラスを作成することができ、それぞれが利用しているモードに応じて使用されます。ただし、これは と という 2 つの別個のステージング クラスを維持することと同じDevStagingですProductionStaging。通常、同じことを 2 回コーディングすることは避けたいので、このオプションはますます望ましくないように見え始めています。

一般に、現在どのステージング モードにいるのかを知ることは、実際にはスレッド化とはあまり関係がなく、スレッド化が関係している場合は問題が大きくなります。モードが変更される理由Stagingは、両方のプログラムが、ステージング (シングルトン) インスタンスによって提供される同じステージング インスタンスを使用するためです。

于 2012-11-08T20:30:15.203 に答える