【发布时间】:2010-02-01 00:33:50
【问题描述】:
对不起,如果这已在其他地方得到回答...我发现了很多类似的帖子,但不一样。
我想确保一次只存在一个对象的一个实例,但我不希望该对象在其自然生命周期之后保留,因为它可能是单例模式。
我正在编写一些代码,其中每分钟都会触发列表处理(通过我无法控制的外部代码)。目前,我每次只创建一个新的“处理”对象,当它超出范围时,它会按照正常情况被销毁。但是,有时处理时间可能超过一分钟,因此下一个触发器将在新线程中创建处理类的第二个实例。
现在,我想要一种机制,一次只能存在一个实例……比如说,某种工厂一次只允许一个对象。对工厂的第二次调用将返回 null,而不是一个新对象。
到目前为止,我的(糟糕的)解决方案是将工厂类型对象作为处理器类的嵌套类:
class XmlJobListProcessor
{
private static volatile bool instanceExists = false;
public static class SingletonFactory
{
private static object lockObj = new object();
public static XmlJobListProcessor CreateListProcessor()
{
if (!instanceExists)
{
lock (lockObj)
{
if (!instanceExists)
{
instanceExists = true;
return new XmlJobListProcessor();
}
return null;
}
}
return null;
}
}
private XmlJobListProcessor() { }
....
}
我正在考虑为 XmlJobListProcessor 类编写一个显式析构函数,将“instanceExists”字段重置为 false。
我意识到这是一个非常糟糕的设计。工厂本身应该是一个类...它只是嵌套的,因此它和实例析构函数都可以访问 volatile 布尔值...
谁有更好的方法来做到这一点?干杯
【问题讨论】:
-
为什么只需要创建一个完整的工厂来创建一个东西?
-
为什么不重写 InitializeLifeTime 以返回 null 以使其保持“活动”?
-
@Pierre - 'Factory' 可能用词不当 - 其想法是将类的实例数限制为一个,即使多个线程可能尝试同时创建它们。并且在不保留对该对象的任何引用的情况下执行此操作,以便它可以具有正常的范围内-范围外生命周期。
-
假设:您希望在这里一次一个任务处理的一个原因是处理列表的每一“轮”都会更改列表内容:因此多线程不可用。免责声明:这个一般领域是我没有重要经验的领域,所以请用“一粒盐”来看待这个问题,并请原谅一个可能非常无知的问题:但是这里与排队的想法是否存在自然的“共鸣”完成任务?
-
一次处理一个的原因是任务类有依赖关系,它们有自己的依赖关系......这个想法是为了防止不必要的使用服务器资源。一次一个就好了。你是对的;队列确实是一种想法,但可能不接受“重复任务”(因为它们都是相同的任务,不需要排队),或者容量为 1。跨度>
标签: c# object-lifetime