gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:33:47 26 4
gpt4 key购买 nike

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

  1. 总是只使用一个实例(可能包装器是一个单例?)。
  2. 它可以被释放以释放那里的驱动程序和资源(IDisposable?)。

来自 Disposable Singleton我可以看到意见分歧,单例是否可以 IDisposable 。也许两者都有更好的解决方案?欢迎任何帮助。
现在我有一个 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

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

关于c# - 如何确保我们只有一个实例,并且以正确的方式处理它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22070729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com