Perbedaan antara OperationCanceledException dan TaskCanceledException?

101

Apa perbedaan antara OperationCanceledExceptiondan TaskCanceledException? Jika saya menggunakan .NET 4.5 dan menggunakan async/ awaitkata kunci, mana yang harus saya cari?

Peter
sumber

Jawaban:

117

OperationCanceledExceptionhanyalah 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.TryTakecontohnya.

Saya akan menangkap OperationCanceledExceptionjaga-jaga jika tugas dibatalkan karena operasi yang baru saja dilakukan OperationCanceledException- Anda mungkin masih ingin memperlakukannya sebagai "hanya pembatalan".

Jon Skeet
sumber
1
Aku datang dengan ForEachAsync sebagian besar dari Stephen Toub ini blog blogs.msdn.microsoft.com/pfxteam/2012/03/05/... . Kemudian jika saya melempar pengecualian di dalam 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.
Terry