2012-03-31 117 views
2

空ではないコンストラクタを持つシングルトンを作成しようとしていますが、シンクロナイズにはアクセスできません:コンポーネントの初期化の順序を制御できないため、コンポーネント初期化する前にシングルトンにアクセスし、それを待たなければなりません。パラメータでシングルトンを遅延初期化

ファクトリメソッドは、[OnWorkerThread]ワーカースレッドの工場の実行を可能属性であり、工場は一度だけ呼ばれる一度だけ呼ばれる、と私initilizationフェーズが

private static volatile GottwareExcelAddin _instance; 
private static readonly ManualResetEvent InitializedEvent=new ManualResetEvent(false); 

    internal static Singleton CurrentInstance 
    { 
     get 
     { 
      InitializedEvent.WaitOne(); 
      return _instance; 
     } 
    } 

    #endregion 

    private Singleton(String url, Int otherstuff) 
    { 
     // do stuff 
     InitializedEvent.Set(); 
    } 


    #region public factory 
    [OnWorkerThread] 
    public static void Singleton(String spaceUrl, _Application excelApp) 
    { 
     if (_instance == null) 
      _instance = new Singleton(spaceUrl, excelApp); 
    } 

例外がスローされます。

例外ソース:私はmyappのを起動すると

は、時々私は次の取得mscorlib 例外タイプ:System.Runtime.InteropServices.SEHException 例外メッセージ:外部コンポーネントが例外をスローしました。 例外ターゲットサイト:WaitOneNative

----スタックトレース---- System.Threading.WaitHandle.WaitOneNative(UInt32型、ブール型、ブールとしてexitContextとしてhasThreadAffinityとしてSafeHandle、millisecondsTimeoutとしてwaitableSafeHandle) AddinExpress.RTD。 2005.dll:N 00000(0x0)JIT System.Threading.WaitHandle.InternalWaitOne(SafeHandleとしてのミリ秒秒数、Int64としてhasThreadAffinity、BooleanとしてexitContextとして) AddinExpress.RTD.2005.dll:N 0020(0x14)IL System.Threading.WaitHandle.WaitOne(Int32として、ミリ秒のタイムアウト、ブール値としてexitContext)

W私は間違っているのですか?

答えて

4

あなたはそこに適切なシングルトンを作成していません。適切なシングルトンには、それにアクセスするための静的メソッドとプライベートコンストラクタが必要です。

シングルトンを初期化するパラメータがある場合、シングルトンを異なるパラメータで複数回初期化するとどういう意味ですか?それはエラーですか?次のように

あなただけの異なるパラメータを持つ複数のinitialisationsを無視することができると仮定すると、あなたはそれを実装することができます(ただし、私はあなたがどこかに設計誤差を持っているかもしれないと思う):

class Singleton 
{ 
    public static Singleton Instance(string param1, int param2) 
    { 
     if (_instance == null) 
     { 
      lock (_locker) 
      { 
       if (_instance == null) // Double-checked locking (works in C#!). 
       { 
        _instance = new Singleton(param1, param2); 
       } 
      } 
     } 

     return _instance; 
    } 

    private Singleton(string param1, int param2) 
    { 
     // Whatever. 
    } 

    private static Singleton _instance; 
    private static readonly object _locker = new object(); 
} 

私は通常、シングルトンを実装するためにレイジーを使用し、あなたのシングルトンのコンストラクターが、シングルトンのアクセスポイントで渡されたパラメーターを必要とする場合は、あまり役に立ちません。

+0

申し訳ありません...私がしたいのは、自分のコードの1つのポイント(起動時)のパラメータでシングルトンを初期化することです。ただし、Excelコンポーネントの初期化の順序(たとえば、スプレッドシートをダブルクリックしてExcelを起動した場合など)では、他のコンポーネントが最初に初期化され、シングルトンにアクセスしようとする可能性があります。メインコンポーネントがシングルトンを初期化するまで待つ必要があります... – Edmondo1984

関連する問題