IDisposableインターフェイスを実装するクラスがあるとします。このようなもの:
MyClassはいくつかのアンマネージ リソースを使用するため、IDisposableのDispose()メソッドはそれらのリソースを解放します。MyClassは次のように使用する必要があります。
using ( MyClass myClass = new MyClass() ) {
myClass.DoSomething();
}
ここで、 DoSomething()を非同期的に呼び出すメソッドを実装したいと考えています。MyClassに新しいメソッドを追加します。
ここで、クライアント側から、MyClassを次のように使用する必要があります。
using ( MyClass myClass = new MyClass() ) {
myClass.AsyncDoSomething();
}
ただし、他に何もしないと、DoSomething()が呼び出される前にオブジェクトmyClassが破棄される可能性があるため、これは失敗する可能性があります(予期しないObjectDisposedExceptionがスローされます)。そのため、 DoSomething()への非同期呼び出しが完了するまで、 Dispose()メソッドへの呼び出し(暗黙的または明示的) を遅らせる必要があります。
Dispose()メソッドのコードは非同期で実行する必要があり、すべての非同期呼び出しが解決されるのは一度だけだと思います。これを達成するための最良の方法を知りたいです。
ありがとう。
注: 簡単にするために、Dispose() メソッドの実装方法の詳細には触れていません。実生活では、私は通常Dispose パターンに従います。
更新:返信ありがとうございます。あなたの努力に感謝します。chakrit がコメントしたように、非同期 DoSomething への複数の呼び出しを行うことができる必要があります。理想的には、次のようなものがうまく機能するはずです。
using ( MyClass myClass = new MyClass() ) {
myClass.AsyncDoSomething();
myClass.AsyncDoSomething();
}
カウンティング セマフォを調べてみます。探しているものと思われます。また、設計上の問題である可能性もあります。都合がよければ、実際のケースとMyClassが実際に行っていることをいくつか紹介します。