gpt4 book ai didi

.net - 带参数的单例延迟初始化

转载 作者:行者123 更新时间:2023-12-01 11:01:48 29 4
gpt4 key购买 nike

我正在尝试创建一个具有非空构造函数的单例并以同步方式访问它:因为我无法控制组件的初始化顺序,如果组件在初始化之前访问单例,它必须等待。

工厂方法只被调用一次,我的初始化阶段抛出异常

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

----堆栈跟踪---- System.Threading.WaitHandle.WaitOneNative(waitableSafeHandle 作为 SafeHandle,millisecondsTimeout 作为 UInt32,作为 bool 值的 hasThreadAffinity,作为 bool 值的 exitContext) AddinExpress.RTD.2005.dll: N 00000 (0x0) JIT System.Threading.WaitHandle.InternalWaitOne(waitableSafeHandle 作为 SafeHandle,millisecondsTimeout 作为 Int64,作为 bool 值的 hasThreadAffinity,作为 bool 值的 exitContext) AddinExpress.RTD.2005.dll: N 0020 (0x14) IL System.Threading.WaitHandle.WaitOne(毫秒超时作为 Int32,exitContext 作为 bool 值)

我做错了什么?

最佳答案

你还没有在那里创建一个合适的单例。一个合适的单例应该有一个访问它的静态方法和一个私有(private)构造函数。

另一个问题是,如果您有用于初始化单例的参数,那么如果您使用不同的参数多次初始化单例,这意味着什么?这是一个错误吗?

假设您可以忽略具有不同参数的多个初始化,您可以按如下方式实现它(但我认为您可能在某处存在设计错误):

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 来实现单例,但如果你的单例构造函数需要在你的单例访问点传入参数,它就没那么有用了。

关于.net - 带参数的单例延迟初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9954344/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com