在处置ObservableCollection时,自动从ObservableCollection中删除它

时间:2016-10-22 18:33:54

标签: c#

也许我的问题表明对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

1 个答案:

答案 0 :(得分:1)

您的解决方案的问题是每个设备对象都需要对集合的引用,这会增加耦合。

更加分离的解决方案是实现从Disposed方法引发的Dispose事件。您将设备添加到集合时订阅该事件,并在事件发生时从集合中删除该设备。