c# – 如何确保我们只有一个实例,并以正确的方式处理它
发布时间:2020-12-15 08:02:59 所属栏目:百科 来源:网络整理
导读:在我写的软件中,我将从外部设备(通过USB连接)读取一些数据.我给出的驱动程序(DLL文件)不是线程安全的,一次只能使用一个实例.我必须在C#中为这些驱动程序编写一个包装器.鉴于我有一个多线程应用程序,我想确保: 始终只使用一个实例(可能包装器是单件?). 它可
在我写的软件中,我将从外部设备(通过USB连接)读取一些数据.我给出的驱动程序(DLL文件)不是线程安全的,一次只能使用一个实例.我必须在C#中为这些驱动程序编写一个包装器.鉴于我有一个多线程应用程序,我想确保:
>始终只使用一个实例(可能包装器是单件?). 从Disposable Singleton我可以看出意见是分歧的,单身是否可以是不可信的.也许两者都有更好的解决方案?欢迎任何帮助. 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中的一个后续模式.避免所有这些双重检查锁定废话:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |