微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 如何确保我们只有一个实例,并以正确的方式处理它

在我写的软件中,我将从外部设备(通过USB连接)读取一些数据.我给出的驱动程序(DLL文件)不是线程安全的,一次只能使用一个实例.我必须在C#中为这些驱动程序编写一个包装器.鉴于我有一个多线程应用程序,我想确保:

>始终只使用一个实例(可能包装器是单件?).
>它可以被处理以释放那里的驱动程序和资源(Idisposable?).

Disposable Singleton我可以看出意见是分歧的,单身是否可以是不可信的.也许两者都有更好的解决方案?欢迎任何帮助.
现在我有一个Idisposable单例,如下所示:

using System;
using System.Runtime.InteropServices;

namespace Philips.Research.Myotrace.DataReading.Devices
{
    class MyDevice: Idisposable
    {
        private static volatile MyDeviceInstance;
        private static object SyncRoot = new Object();

        private bool disposed = false;

        private MyDevice()
        {
            //initialize unmanaged resources here (call LoadLibrary,Initialize,Start etc)
        }

        public MyDevice GetInstance()
        {
            if (Instance == null)
            {
                lock (SyncRoot)
                {
                    if (Instance == null)
                    {
                        Instance = new MyDevice();
                    }
                }
            }

            return Instance;
        }

        public void dispose()
        {
            this.dispose(true);
        }

        protected virtual void dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    //dispose of unmanaged resources here (call Stop and Close from reflection code

                    Instance = null;
                }

                this.disposed = true;
            }
        }

        [DllImport("devicedrivers.dll")]
        private static extern bool Initialize();
        [DllImport("devicedrivers.dll")]
        private static extern bool LoadLibrary();
        [DllImport("devicedrivers.dll")]
        private static extern bool Start();
        [DllImport("devicedrivers.dll")]
        private static extern bool Stop();
        [DllImport("devicedrivers.dll")]
        private static extern bool Close();
        //and few more
    }
}

解决方法

操作系统负责在进程终止时清理非托管资源.因此,如果您对从首次使用资源到程序终止时分配的资源感到满意,我根本不会实现Idisposable.

话虽如此,为了可测试性,我很可能会避免公开暴露单身人士.考虑创建一个接口并使用依赖注入在整个代码中注入相同的实例.我一般不喜欢单身人士.如果你打算使用一个,我建议你遵循我article on singletons中的一个后续模式.避免所有这些双重检查锁定废话:)

原文地址:https://www.jb51.cc/csharp/100450.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐