空ではないコンストラクタを持つシングルトンを作成しようとしていますが、シンクロナイズにはアクセスできません:コンポーネントの初期化の順序を制御できないため、コンポーネント初期化する前にシングルトンにアクセスし、それを待たなければなりません。パラメータでシングルトンを遅延初期化
ファクトリメソッドは、[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私は間違っているのですか?
申し訳ありません...私がしたいのは、自分のコードの1つのポイント(起動時)のパラメータでシングルトンを初期化することです。ただし、Excelコンポーネントの初期化の順序(たとえば、スプレッドシートをダブルクリックしてExcelを起動した場合など)では、他のコンポーネントが最初に初期化され、シングルトンにアクセスしようとする可能性があります。メインコンポーネントがシングルトンを初期化するまで待つ必要があります... – Edmondo1984