Jawaban:
OperationCanceledException
hanyalah kelas dasar untuk TaskCanceledException
- jadi jika Anda menangkap yang pertama, Anda masih akan menangkap yang terakhir.
Beberapa operasi pada koleksi serentak hanya dilakukan OperationCanceledException
, karena tidak ada tugas aktual yang terlibat (setidaknya sejauh menyangkut API publik). Lihat BlockingCollection.TryTake
contohnya.
Saya akan menangkap OperationCanceledException
jaga-jaga jika tugas dibatalkan karena operasi yang baru saja dilakukan OperationCanceledException
- Anda mungkin masih ingin memperlakukannya sebagai "hanya pembatalan".
await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );
entah bagaimana itu 'diubah' menjadi TaskCanceledException. Tahu bagaimana mungkin? Ini adalah masalah bagi saya karena saya ingin menangkap OperationCanceledException 'sejati' melalui catch (OperationCanceledException) tetapi saya tidak ingin TaskCanceledException ini (yang seharusnya menjadi ApplicationException) tertangkap.