我有一个Windows服务,其中包含一个单例,后者又使用一些记录器,消息队列侦听器等。这些类实现了IDisposable
。我应该在单例中实现IDisposable
还是做其他事情以确保在服务停止/崩溃之后一切都可以使用本机资源吗?
单身实现如下:
public class Temp
{
private static readonly Lazy<Temp> instance = new Lazy<Temp>(() => new Temp());
private Temp()
{
// create IDisposable objects which use native resources
}
public static Temp Instance
{
get
{
return instance.Value;
}
}
}
答案 0 :(得分:4)
我宁愿在单身人士上不实施 IDisposable
:IDisposable
挑衅开发者 Dispose (单身) )实例:
using(var temp = Temp.Instance) {
...
}
导致(可能)崩溃在应用程序的其他部分(因为单个Temp
实例已被处置):
Temp.Instance.SomeFucntion(); // <- possible fail, since Temp.Instanceis disposed
在极少数情况下,如果您必须释放获得的某些资源,我会使用ProcessExit
事件
public class Temp {
private static readonly Lazy<Temp> instance = new Lazy<Temp>(() => new Temp());
private void OnProcessExit(Object sender, EventArgs e) {
// Release native resource if required:
// some resources e.g. files will be closed automatically,
// but some e.g. transactions should be closed (commit/rollback) manually
try {
...
}
finally {
AppDomain.CurrentDomain.ProcessExit -= OnProcessExit;
}
}
private Temp() {
// create IDisposable objects which use native resources
// If you have to release some resouces on exit
AppDomain.CurrentDomain.ProcessExit += OnProcessExit;
}
public static Temp Instance {
get {
return instance.Value;
}
}
}
答案 1 :(得分:1)
没有;单身人士不应该实施IDisposable
。如果有人在其他人需要时过早地处理该实例会怎么样?
另请注意,当您的服务崩溃/停止时,实施IDisposable
将无法帮助您。你必须手动处理它!但是你找不到合适的时间去做。
答案 2 :(得分:1)
如果某个类型将从工厂返回,有时需要在调用者使用它们时进行清理,则该类型应实现IDisposable
。如果特定工厂返回的实际上不需要任何资源的共享单例对象,则工厂返回的对象应该具有Dispose
方法,该方法默默无效。如果工厂需要提供对共享单例资源的访问(例如存储在GDI对象中的不可变位图),它应该返回一个包装器,它将在调用其Dispose
方法时通知工厂;然后,工厂可以维护包装器对象的引用计数,并在知道不再创建包装器并且已经处理掉所有现有包装器之后清理该资源。