C# 如何使用Lazy<;T>;(Func<;T>;valueFactory),如果init失败,它不应该使用缓存异常,也不应该为init运行多个线程

C# 如何使用Lazy<;T>;(Func<;T>;valueFactory),如果init失败,它不应该使用缓存异常,也不应该为init运行多个线程,c#,lazy-initialization,C#,Lazy Initialization,如何使用C#的Lazy(Func valueFactory),如果初始化失败,它不应该使用缓存异常,同时也不应该运行多个线程进行初始化 如果我仅将LazyThreadSafetyMode.PublicationOnly用作第二个参数,那么它将在启动时运行多个线程进行初始化,并在初始化时发生异常时从所有线程抛出异常。但是如果我使用LazyThreadSafetyMode.ExecutionAndPublication作为第二个参数,它将缓存异常并重新刷新该异常,并且不再重新初始化它 我需要一个模式

如何使用C#的Lazy(Func valueFactory),如果初始化失败,它不应该使用缓存异常,同时也不应该运行多个线程进行初始化

如果我仅将LazyThreadSafetyMode.PublicationOnly用作第二个参数,那么它将在启动时运行多个线程进行初始化,并在初始化时发生异常时从所有线程抛出异常。但是如果我使用LazyThreadSafetyMode.ExecutionAndPublication作为第二个参数,它将缓存异常并重新刷新该异常,并且不再重新初始化它

我需要一个模式/版本,它应该在单线程上运行以进行初始化,并且不应该缓存异常

我不能使用构造函数版本,因为我必须根据运行时设置的一些参数有条件地创建不同的t实例


我正在使用Lazy(func())并有条件地返回不同的实现

文档,例如“如果使用未指定初始化方法的
Lazy
构造函数,则不会缓存
T
的无参数构造函数引发的异常”-并继续说-“当您指定。。ExecutionAndPublication,[exception]缓存取决于您是指定初始化方法还是允许使用T的无参数构造函数”-因此答案取决于初始化的内容。Hi@stuartd:这里我不能使用构造函数版本,因为我必须有条件地创建T的不同实例,我使用的是Lazy(func())并根据运行时设置的一些参数有条件地返回不同的实现。我还更新了上面的描述。因此,您面临的问题似乎是“按设计”——如果您使用指定初始化方法(valueFactory参数)的
惰性
构造函数,如果该初始化方法在您第一次调用Value属性时引发异常(或无法处理异常),则该异常将被缓存,并在后续调用Value属性时再次引发。“@usFarswan请发布您的实际代码,不要描述它。为什么首先要采用工厂方法?您是否试图使用异常作为开关?据我所知,您所寻找的(不常见)行为无法通过
Lazy
类实现。您需要自己实现它,比如“如果您使用的是未指定初始化方法的
Lazy
构造函数,则不会缓存由
T
的无参数构造函数引发的异常”-然后说-“当您指定..ExecutionAndPublication,[exception]缓存取决于是否指定初始化方法或是否允许使用T的无参数构造函数”-因此答案取决于初始化的内容。Hi@stuartd:这里我不能使用构造函数版本,因为我必须有条件地创建T的不同实例,我使用的是Lazy(func())以及根据运行时设置的一些参数有条件地返回不同的实现。我还更新了上面的描述。因此,听起来您面临的问题是“按设计”——如果您使用指定初始化方法(valueFactory参数)的
惰性
构造函数,并且如果该初始化方法引发异常(或无法处理异常)第一次调用Value属性时,将缓存异常,并在后续调用Value属性时再次抛出该异常。“@usFarswan发布您的实际代码,请不要描述它。为什么首先要采用工厂方法?您是否试图使用异常作为开关?据我所知,您所寻找的(不常见)行为无法通过
Lazy
类实现。您需要自己实现它