我有一个Singleton类来管理与外部设备的连接。我的应用程序的想法是,我需要在应用程序处于活动状态时始终显示外部设备。
Singleton具有以下功能:
对于最后一部分,我正在考虑将代码放在singleton类的Dispose
方法中,以保证资源在关闭时始终是清理的。但由于我使用的是Singleton,并且由于单例生命周期只会在应用程序退出时终止,因此无需在Dispose
中明确关闭连接,因为无论如何连接都将关闭。
所以,问题是,我应该将紧密连接代码放在Dispose
方法中吗?
答案 0 :(得分:3)
单独实施IDisposable并不意味着退出时会调用Dispose
。
没有足够的细节来理解你的应用程序,但是如果关闭不正确使得设备处于不良状态而不是try / finally或者Moron建议Application.Exit(取决于当然的应用程序)。
即便如此,你也无法保证代码能够执行,所以也许我不清楚你想要完成什么或者你想要解决什么问题。
修改强>
根据OP评论最好的选择(因为他希望“清理”代码执行而不是专门调用和untestable)将把它放在解构器/终结器中。请注意,这不能保证运行,但应该在大多数情况下运行而不被调用(与Dispose不同):
public class Foo
{
public Foo()
{
//Constructor
}
~Foo()
{
// Deconstructor/finalizer
}
}
答案 1 :(得分:2)
IDisposable!=像C ++这样的析构函数,它必须被明确地调用。
无论如何,拥有一次性单身人士并没有多大意义,IMO。如果某些代码实际上解决了你的单身人士怎么办?如果其他一些代码现在尝试访问该单例,会发生什么?出于这个原因,你可能不应该把连接放在那里。
事实上,你应该不甚至在第一个地方中使用Singleton实现IDisposable。
更好的选择可能是将Singleton挂钩到其中一个.NET退出事件上。也许使用Application.ApplicationExit(或Application.Exit)事件或类似事件。
答案 2 :(得分:1)
这是糟糕的设计。您可以在适当的时候使用打开和关闭方法更好地服务。它将更容易测试,调试和支持。
答案 3 :(得分:0)
同时执行两个操作,如同使用显式的Close()或Shutdown()方法,并在dispose中调用它(如果调用了track,请参阅dispose pattern help ...)
这样你就可以实现IDisposable接口(这意味着明显的意图)并在你的代码中调用它。
您是否在启动代码周围使用“finally”块?
internal static class App
{
[STAThread]
private static void Main(string[] args)
{
try
{
Thing.Startup();
Application.Run();
}
finally
{
Thing.Shutdown(); // or dispose
}
}
}
让我的漂移?!
PK: - )
PS:“单身”应该写成普通类,单身部分应该是外部使用的东西
答案 4 :(得分:0)
正如其他人所说,Dispose不会在退出时自动调用,但会调用终结器方法。我会这样做,而是在应用程序退出时执行清理逻辑。