Я пытаюсь создать singleton, который имеет непустой конструктор и получить доступ к нему синхронно: поскольку я не контролирую порядок инициализации моего компонента, если компонент доступ к синглтону перед его инициализацией, он должен ждать.Lazy инициализация singleton с параметрами
Фабричный метод вызывается только один раз, и моя фаза 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);
}
код [OnWorkerThread] является атрибутом, который делает фабрику работать на рабочем потоке, а завод вызывается только один раз ,
Когда я запускаю MyApp, иногда я получаю следующее:
Exception Источник: mscorlib Тип исключения: System.Runtime.InteropServices.SEHException Сообщение исключения: Внешний компонент бросил исключение. Исключение Цель сайта: WaitOneNative
---- Трассировка стека ---- System.Threading.WaitHandle.WaitOneNative (waitableSafeHandle Как SafeHandle, millisecondsTimeout Как UInt32, hasThreadAffinity As Boolean, exitContext As Boolean) AddinExpress.RTD. 2005.dll: N 00000 (0x0) JIT System.Threading.WaitHandle.InternalWaitOne (waitableSafeHandle As SafeHandle, millisecondsTimeout As Int64, hasThreadAffinity As Boolean, exitContext As Boolean) AddinExpress.RTD.2005.dll: N 0020 (0x14) IL System.Threading.WaitHandle.WaitOne (миллисекундыTimeout As Int32, exitContext As Boolean)
W шляпа, я делаю неправильно?
Извините ... Что я хочу сделать, так это то, что я инициализирую синглтон с параметрами из одной точки в моем коде (при запуске). Однако из-за порядка инициализации компонентов Excel (например, при запуске Excel двойным щелчком по электронной таблице) сначала могут быть инициализированы другие компоненты и попытаться получить доступ к синглтону. Я хочу, чтобы они подождали, пока основной компонент не инициализирует singleton ... – Edmondo1984