0

次の ServiceBehavior 属性で定義された WCF サービス エンドポイントがあります。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]

オブジェクトが一度だけ作成されることを保証する必要があるサービス内の呼び出しに問題があります。次のコードは、私のサービス内で呼び出されます。

public class MySingletonDataProvider{
     private static MySingletonDataProvider _instance;
     private static readonly object _lock = new object();

     public static MySingletonProvider Create(){

          lock(_lock){

              if(_instance == null){
                 _instance = new MySingletonProvider();
                 Log.Info("New Instance Created " + AppDomain.CurrentDomain.FriendlyName");
              }

              return _instance;
          }
     }
}

これがヒットすると、通常、次のような 3 ~ 5 個のログが取得されます。

- "New Instance Created 123252352323623"
- "New Instance Created 423523562362362"
- "New Instance Created 235623623462366"

複数の AppDomains がロック内でコードを実行できることを示しています。これは大きな問題を引き起こしています。このインスタンスが一度しか作成されないことを保証できる解決策は何ですか?

4

1 に答える 1

0

CLR は AppDomain ごとに新しい MySingletonDataProvider インスタンスを作成するため、個別のロック オブジェクトがあります。たとえば、ミューテックスなど、ある種のプロセス間同期プリミティブを使用することをお勧めします。 http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx

于 2013-11-05T16:57:13.293 に答える