在我写的软件中,我将从外部设备(通过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中的一个后续模式.避免所有这些双重检查锁定废话:)