Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在单身中使用--好的做法?_C#_Singleton - Fatal编程技术网

C# 我可以在单身中使用--好的做法?

C# 我可以在单身中使用--好的做法?,c#,singleton,C#,Singleton,我有一个单例类,它管理到外部设备的连接。我的应用程序的想法是,当应用程序处于活动状态时,我需要始终显示外部设备 Singleton具有以下功能: 初始化时,在应用程序启动时查找设备 与外部设备通信,请注意,这可能分布在多个点的多个部件上 当应用程序退出时关闭连接 对于最后一部分,我考虑将代码放在singleton类的Dispose方法中,以确保资源在关闭时始终处于清理状态。但由于我使用的是单例,而且单例生命周期只有在应用程序退出时才会终止,因此无需在Dispose中显式关闭连接,因为连接无论如何

我有一个单例类,它管理到外部设备的连接。我的应用程序的想法是,当应用程序处于活动状态时,我需要始终显示外部设备

Singleton具有以下功能:

  • 初始化时,在应用程序启动时查找设备
  • 与外部设备通信,请注意,这可能分布在多个点的多个部件上
  • 当应用程序退出时关闭连接
  • 对于最后一部分,我考虑将代码放在singleton类的
    Dispose
    方法中,以确保资源在关闭时始终处于清理状态。但由于我使用的是单例,而且单例生命周期只有在应用程序退出时才会终止,因此无需在
    Dispose
    中显式关闭连接,因为连接无论如何都会关闭


    因此,问题是,我是否应该将紧密连接代码放在
    Dispose
    方法中?

    IDisposable!=析构函数类似C++,必须明确调用。 无论如何,在我看来,拥有一个一次性的单例并没有多大意义。如果一些代码确实处理了你的单例呢?如果其他代码现在试图访问该单例,会发生什么?出于这个原因,您可能不应该关闭连接

    事实上,您甚至不应该首先让单例实现IDisposable

    一个更好的选择可能是将Singleton挂钩到一个.NET退出事件上。可能使用Application.ApplicationExit(或Application.Exit)事件或类似的事件。

    单独实现并不意味着退出时将调用
    Dispose

    没有足够的细节来理解您的应用程序,但是如果关闭不正确,会使设备处于不良状态,而不是try/finally或按照傻瓜建议的应用程序。退出(当然取决于应用程序)

    即使这样,您也不能保证代码能够执行,所以我可能不清楚您想要完成什么,或者您想要解决什么问题

    编辑:

    根据OPs的评论,最好的选择(因为他希望执行“清理”代码而不被特别调用和不稳定)是将其放入解构器/终结器中。注意:这不能保证运行,但在大多数情况下应该运行而不被调用(与Dispose不同):


    这两种方法都要执行,例如,有一个显式的Close()或Shutdown()方法,并在dispose中调用它(如果调用了track等,请参阅dispose模式帮助…)

    通过这种方式,您可以实现IDisposable接口(这使得意图显而易见),并在代码中调用它

    您是否在启动代码周围使用“finally”块

    internal static class App
    {
        [STAThread]
        private static void Main(string[] args)
        {
            try
            {
                Thing.Startup();
                Application.Run();
            }
            finally
            {
                Thing.Shutdown(); // or dispose
            }
        }
    }
    
    明白我的意思吗

    主键:-)



    PS:“singleton”应该作为一个普通类编写,singleton部分应该是一个外部使用的东西

    正如其他人所说,Dispose不会在退出时自动调用,但是会调用finalizer方法。我会这样做,而不是在应用程序退出时执行清理逻辑。

    这是一个糟糕的设计。如果在适当的时间调用开放和关闭方法,您会得到更好的服务。它将更易于测试、调试和支持。

    @cory,我正在努力确保当应用程序退出时,无论发生什么,连接都将关闭。@Ngu Soon Hui:这是我不理解的部分。当应用程序退出时(无论如何),通信关闭。那么,您是否正在尝试防止设备处于不良状态?或者别的什么?我试图手动防止应用程序退出时通信关闭。没有保证的方法来确保(考虑异常应用程序退出,即:电源故障),但终结器将在您调用它时被调用。与dispose不同,使用
    Application.Exit
    使我在所有应用程序中实现相同的代码行,这是我非常讨厌的。我不想担心关闭连接部分,如果可能的话.NEt将在退出时引发一些事件。让你的singleton类钩住它,然后关闭那里的连接。查看MSDN。这可能是一个很好的起点。@Ngu:如果您想干净地关闭连接,您必须编写该代码。主要问题是,+1用于将生命周期管理与其他功能分离!您可以使用带有IoC容器框架的普通旧CLR对象来处理生命周期管理。我拒绝使用容器进行管理(例如castle windsor)…-)最后一部分
    Thing.Shutdown()
    是我希望避免在
    main
    body@ngu很快,慧同意了,这只是为了让对方明白这一点。我尽量用纯类代码的形式,使代码更干净,在正常情况下,是的。不正常,我不明白。他试图用他的问题来防止什么问题,并且他能在下次加载/使用时解决它吗?即使在正常情况下也不能保证调用终结器。我错过了一些新的.NET开发吗?没有什么是可以保证的,这是我的主要观点。我认为他只是要求一些他不需要特别调用/执行的东西。这就是解构器/终结器所提供的。@科里:是的,没有任何保证。你/凯文可能猜对了,尽管标题(在Singleton good practice中IDisposable?)有问题。依赖终结器是一个非常糟糕的主意,因为你永远不知道它们何时运行,甚至是否运行。是的。。。我总是发现可验证、可测试的代码很麻烦。但我不担心,因为我整晚都在睡觉。
    internal static class App
    {
        [STAThread]
        private static void Main(string[] args)
        {
            try
            {
                Thing.Startup();
                Application.Run();
            }
            finally
            {
                Thing.Shutdown(); // or dispose
            }
        }
    }