หากคุณสร้างงานและคุณไม่เคยเรียกtask.Wait()
หรือพยายามดึงผลลัพธ์ของ a Task<T>
เมื่องานถูกรวบรวมโดยผู้รวบรวมขยะงานนั้นจะฉีกใบสมัครของคุณในระหว่างการสรุป สำหรับรายละเอียดโปรดดูหน้า MSDN ในการจัดการข้อยกเว้นใน TPL
ตัวเลือกที่ดีที่สุดคือ "จัดการ" ข้อยกเว้น สิ่งนี้สามารถทำได้ผ่านการสานต่อ - คุณสามารถแนบความต่อเนื่องกับงานและบันทึก / กลืน / ฯลฯ ข้อยกเว้นที่เกิดขึ้น นี่เป็นวิธีที่สะอาดในการบันทึกข้อยกเว้นของงานและสามารถเขียนเป็นวิธีการขยายแบบธรรมดาได้เช่น:
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);
}
ด้วยวิธีการข้างต้นคุณสามารถป้องกันไม่ให้งานใด ๆ ฉีกแอพและบันทึกผ่าน:
Task.Factory.StartNew( () =>
{
// Do your work...
}).LogExceptions();
หรือคุณสามารถสมัครรับTaskScheduler.UnobservedTaskExceptionและจัดการได้ที่นั่น
Off
ในคลาสที่มีชื่อว่าเป็นคำสี่ตัวอักษรที่คุณเลือกและใช้สิ่งนี้สำหรับการจับต่อเนื่องทั้งหมดของคุณ ช่วยต่อสู้กับความขุ่นมัวที่ถูกกักขังจากข้อยกเว้นนี้