そのフレームワークの設計には本質的に欠陥があると思います。説明させてください:
1. [...]フレームワーク内のいくつかのオブジェクト。要件により、 event を提供する必要がありますObjectTerminated
。
これは意味がありません。イベントの名前が示すように、オブジェクトが終了した場合、そのオブジェクトは既になくなっており、アクセスできなくなっていると想定します。これにより、次の 2 つの疑問が生じます。
2. 私は彼らの生活をコントロールしていません。
では、誰が彼らの寿命をコントロールしているのでしょうか? 適切なタイミングで必要なクリーンアップ作業を行う、またはトリガーすることが彼らの責任ではないのはなぜですか? この点についてさらに詳しく説明しましょう。
3. [...] このイベントにサブスクライブして、管理されていないものをクリーンアップできます [...]
この管理されていないものはどこにあり、どのオブジェクトがそれを処理する責任がありますか? それがあなた自身のオブジェクトである場合、なぜあなたのオブジェクトはそれを処分しないのですか? 代わりに、他の誰かが物を処分できるように、代わりにイベントをトリガーしたいのはなぜですか? 隣人が自分でゴミを片付けるのではなく、私が隣人のゴミを片付けるようなものです。(私はそこでおばあさんについて話しているのではありません。)
あなたのクラスは、次のようになれば、より意味のあるものになります:
class SomeWorkflowControlObject : IDisposable
{
// the following event doesn't make sense, sorry.
// public event EventHandler<> ObjectTerminated;
private IntPtr _handleToUnmanagedResource;
~SomeWorkflowControlObject()
{
Dispose(explicitly: false);
}
public void Dispose()
{
Dispose(explicitly: true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool explicitly)
{
if (explicitly)
{
// free managed resources here; perhaps trigger an event 'Disposing'.
}
DisposeUnmanagedResource(_handleToUnmanagedResource);
}
}
つまり、それは管理されていないリソースのラッパーであり、その処分についてはそれ自体が責任を負い、他の誰にも責任はありません。したがって、他の誰かが管理されていないリソースを処分できるように、イベントをトリガーする必要はなくなりました。