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.