おそらく私の質問は、IDisposibleの仕組みが理解できないことを示していますが、HIDデバイスとの通信を管理するクラスオブジェクトのコレクションがあります。 HIDデバイスがアクティブでなくなったときや通信中であることを検出して自分自身を破棄しますが、クラスオブジェクトをすべて破棄してObservableCollectionから削除することもできます。ObservableCollectionから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
IDisposableにObservableCollectionへの参照が必要なのではないかと思いますが、Dispose()はRemove(this)を呼び出すことができます – Sentry
@Sentry thats私が思うものは上記のサンプルを編集したものですが、競合状態はここではヌル参照となる。 – Wobbles
Winformsは[IComponent'](https://msdn.microsoft.com/en-us/library/system.componentmodel.icomponent(v = vs.110).aspx)を使用してこの種のロジックを実行します。 'ISite'オブジェクトは、コンポーネントが保持されているコンテナを指しています。そして、自分自身を親コレクションから削除することができます。 –