也许我的问题表明对IDisposible的工作方式缺乏了解,但我有一组管理与HID设备通信的类对象,每种类型都有自己的逻辑来检测HID设备何时不再活动或通信将处置自己,但我也希望从我的ObservableCollection中删除类对象,该对象存储所有这些对象。
由于这是一个线程化的环境,我很难想象一种实现不会面临竞争条件的解决方案的方法。
到目前为止,Google只针对相反的情况提供了解决方案(从列表中删除了一个对象)。这么简单吗?
#region IDisposable Support
private bool disposedValue = false; // To detect redundant calls
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
_hdevice.CancelIO();
_hdevice.CloseDevice();
_hdevice.Dispose();
}
// TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
// TODO: set large fields to null.
//Remove device from its collection
lock (DeviceEnumerator.Devices)
{
DeviceEnumerator.Devices.Remove(this);
}
disposedValue = true;
}
}
// TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
// ~Dualshock4() {
// // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
// Dispose(false);
// }
// This code added to correctly implement the disposable pattern.
public void Dispose()
{
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose(true);
// TODO: uncomment the following line if the finalizer is overridden above.
// GC.SuppressFinalize(this);
}
#endregion
答案 0 :(得分:1)
您的解决方案的问题是每个设备对象都需要对集合的引用,这会增加耦合。
更加分离的解决方案是实现从Disposed
方法引发的Dispose
事件。您将设备添加到集合时订阅该事件,并在事件发生时从集合中删除该设备。