次のような複数のタスクを作成するforeachループがあります。
[編集:CreateDisposableAsyncはタスクを返します[IDisposable]]
foreach(...)
{
tasks.Add(CreateDisposableAsync());
}
その後、私はこれらすべてのタスクを待ち、例外をキャッチします。
try
{
await Task.WhenAll(tasks);
}
catch (AggregateException)
{
// handle exceptions
}
しかし、CreateDisposableAsync()を呼び出すと、IDisposableが返されます。これは、いずれかのタスクで例外が発生したかどうかに関係なく、破棄したいと思います。これどうやってするの?
[編集:CreateDisposableAsync()関数は、それ自体が例外をスローした場合、作成されたオブジェクトを破棄していたことが判明したため、元のコードに問題はありませんでした。]
コメントから
Q:結果を破棄することを除いて、呼び出し元のコードの結果で他のことをしますか(またはしたいですか)
A:いいえ、しません
これを行う最も簡単な方法は、CreateDisposableAsync
メソッドが戻る前に自身のリソースをクリーンアップして、のTask
代わりに返すことですTask<IDisposable>
。OPに表示されている既存の呼び出しコードを変更する必要はありません。
// change the signature
async Task CreateDisposableAsync(){
// use using blocks for anything that needs to be disposed
// try/finally is also acceptable
using(var someDisposableInstance = new SomethingDisposable()){
// implementation
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加