2016-10-22 7 views
0

おそらく私の質問は、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 
+2

IDisposableにObservableCollectionへの参照が必要なのではないかと思いますが、Dispose()はRemove(this)を呼び出すことができます – Sentry

+0

@Sentry thats私が思うものは上記のサンプルを編集したものですが、競合状態はここではヌル参照となる。 – Wobbles

+0

Winformsは[IComponent'](https://msdn.microsoft.com/en-us/library/system.componentmodel.icomponent(v = vs.110).aspx)を使用してこの種のロジックを実行します。 'ISite'オブジェクトは、コンポーネントが保持されているコンテナを指しています。そして、自分自身を親コレクションから削除することができます。 –

答えて

1

ソリューションの問題は、各デバイスオブジェクトは、結合を増加コレクションへの参照を必要とすることです。

さらにデカップリングされたソリューションは、Disposeメソッドから発生したDisposedイベントを実装することです。コレクションにデバイスを追加すると、イベントを購読し、イベントが発生したときにコレクションからデバイスを削除します。

+0

コレクションが静的な観測可能なコレクションとして格納され、簡単にアクセスできるので、コレクション内のコレクションを十分にリフレッシュするのは簡単です。処分イベントのアイデアは面白いですね。 – Wobbles

+0

それが簡単だからといって、それが正しいというわけではありません。あなたは、コンポーネントをできるだけ独立させておきます。それはもっと難しいように思えるかもしれませんが、長期的には保守や進化が容易になります。 –

+0

私は実際に自分自身の再利用可能な 'INotifyDisposed'インターフェースを作成し始めました。何も考えずに、' MyObj'が処分された場合、親オブジェクトが 'MyObj.Disposed'イベントをフックする方法はありますか?私の用語について厳格にしたいのであれば、私ができることは、「処分する」ことです。 – Wobbles

関連する問題