我正在尝试创建一个具有非空构造函数的单例并以同步方式访问它:因为我无法控制组件的初始化顺序,如果组件在初始化之前访问单例,它必须等待。
工厂方法只调用一次,我的启动阶段抛出异常
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时,有时会得到以下内容:
异常来源:mscorlib 异常类型:System.Runtime.InteropServices.SEHException 异常消息:外部组件抛出异常。 例外目标站点:WaitOneNative
---- Stack Trace ---- System.Threading.WaitHandle.WaitOneNative(waitableSafeHandle As SafeHandle,millisecondsTimeout As 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(millisecondsTimeout As Int32,exitContext As Boolean)
我做错了什么?
答案 0 :(得分:6)
你还没有在那里创建一个合适的单身人士。一个合适的单例应该有一个静态方法来访问它,以及一个私有构造函数。
另一个问题是,如果您有用于初始化单例的参数,如果使用不同的参数多次初始化单例,这意味着什么?这是一个错误吗?
假设您可以忽略使用不同参数的多个初始化,您可以按如下方式实现它(但我认为您可能在某处出现设计错误):
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();
}
我通常使用Lazy来实现单例,但如果你的单例的构造函数需要在你的单例访问点传入参数,那就没那么有用了。