Jika Anda membuat Tugas, dan Anda tidak pernah memanggil task.Wait()
atau mencoba mengambil hasil dari Task<T>
, saat tugas dikumpulkan oleh pengumpul sampah, itu akan menghancurkan aplikasi Anda selama finalisasi. Untuk detailnya, lihat halaman MSDN tentang Penanganan Pengecualian di TPL .
Opsi terbaik di sini adalah "menangani" pengecualian. Ini dapat dilakukan melalui kelanjutan - Anda dapat melampirkan kelanjutan ke tugas, dan mencatat / menelan / dll pengecualian yang terjadi. Ini menyediakan cara yang bersih untuk mencatat pengecualian tugas, dan dapat ditulis sebagai metode ekstensi sederhana, yaitu:
public static void LogExceptions(this Task task)
{
task.ContinueWith( t =>
{
var aggException = t.Exception.Flatten();
foreach(var exception in aggException.InnerExceptions)
LogException(exception);
},
TaskContinuationOptions.OnlyOnFaulted);
}
Dengan cara di atas, Anda dapat mencegah tugas apa pun dari merobohkan aplikasi, dan mencatatnya, melalui:
Task.Factory.StartNew( () =>
{
// Do your work...
}).LogExceptions();
Alternatifnya, Anda bisa berlangganan ke TaskScheduler.UnobservedTaskException dan menanganinya di sana.
Off
di kelas yang dinamai sebagai kata empat huruf pilihan Anda, dan gunakan ini untuk kelanjutan penampung semua. Membantu memerangi beberapa frustrasi yang terpendam dari pengecualian khusus ini..Net 4.0
. Penanganan pengecualian diubah secara default.net 4.5
untuk tidak merusak aplikasi . Lihat selengkapnya di Penanganan Pengecualian Tugas di .NET 4.5Tentu; itu berarti
Task
diselesaikan setelah diserahkan ke pengumpulan sampah, tetapi tugas itu sendiri gagal. Ada dua perbaikan:ContinueWith(...)
untuk berlangganan, dan periksa.IsFaulted
dan.Exception
diTask
dalam parameter)TaskScheduler.UnobservedTaskException
acara tersebut, dan menandainya sebagai observasi (panggile.SetObserved()
setelah mencatat kesalahan)sumber
IsFaulted
, Anda dapat menggunakanOnlyOnFaulted
opsi kelanjutan dan menghindari pemeriksaan manual ...SetObserved
padaUnobservedTaskExceptionEventArgs
kebutuhan untuk dipanggil.Coba yang ini:
sumber