OperationCanceledExceptionとTaskCanceledExceptionの違いは何ですか?


101

違いは何であるOperationCanceledExceptionとはTaskCanceledException?.NET 4.5を使用していて、async/ awaitキーワードを使用している場合、どちらを検出する必要がありますか?

回答:


117

OperationCanceledExceptionは単にの基本クラスTaskCanceledExceptionです。前者をキャッチした場合でも、後者をキャッチします。

(少なくともパブリックAPIに関する限り)OperationCanceledException実際のタスクが含まれていないため、並行コレクションに対する一部の操作はをスローします。BlockingCollection.TryTake例については、を参照してください。

OperationCanceledExceptionそれ自体がスローした操作によってタスクがキャンセルされた場合に備えて、私はそれをキャッチしOperationCanceledExceptionます。おそらく、それを「キャンセル」として扱いたいと思うでしょう。


1
主にStephen Toubのブログblogs.msdn.microsoft.com/pfxteam/2012/03/05/…からForEachAsyncを思いつきました。次に、await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );何らかの方法で例外をスローすると、TaskCanceledExceptionに「変更」されます。それがどのようになり得るか考えていますか?キャッチ(OperationCanceledException)を介して「true」のOperationCanceledExceptionをキャッチしたいのですが、このTaskCanceledException(実際にはApplicationExceptionであるはずです)をキャッチしたくないので、これは私にとって問題です。
Terry
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.