내가 쓰고있는 소프트웨어에서 (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
}
}
실제로 처분해야합니까? 언제 그렇게 할거 니? 아마도 응용 프로그램의 끝 부분에서만 - 그리고 프로세스가 사라지면 왜 명시 적으로 해제 귀찮게합니까? (자동으로 실행됩니다.) 싱글 톤 패턴을 더 단순하게 만들려면 http://csharpindepth.com/Articles/General/Singleton.aspx를 읽고 싶을 수도 있습니다. –
적절한 종료 함수 (드라이버 소스의 문서 없음)를 호출하지 않으면 관리되지 않는 코드가 어떻게 동작 할 것인지 확신 할 수 없습니다. –
OS는 일반적으로 프로세스 종료시 관리되지 않는 리소스를 정리할 책임이 있습니다. 프로세스 기간 동안 열린 상태로 유지하려는 리소스의 경우 정상이어야합니다. –