Tôi đang cố gắng tìm ra lý do tại sao ứng dụng bảng điều khiển của tôi không bị rách nát bởi một ngoại lệ công việc không được giải quyết. Tất cả những gì tôi làm là tạo ra một nhiệm vụ mà ngay lập tức tôi ném một ngoại lệ. Cuối cùng tôi buộc GC. Trong ví dụ đầu tiên, tôi có một trình xử lý cho sự kiện TaskScheduler.UnobservedTaskException
và tôi có thể thấy ngoại lệ được xử lý.Ứng dụng giao diện điều khiển không bị rách bởi một ngoại lệ nhiệm vụ chưa được giải quyết
static async Task ThrowsException()
{
Console.WriteLine("Throwing!");
throw new Exception("Test exception");
}
static void Main(string[] args)
{
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
ThrowsException();
Console.WriteLine("Collecting garbage.");
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("Done collecting garbage.");
Console.ReadKey();
}
static void TaskScheduler_UnobservedTaskException(object sender,
UnobservedTaskExceptionEventArgs e)
{
Console.WriteLine("Unobserved task exception occured in finalizer.");
Console.WriteLine(e.Exception.InnerException.Message);
}
Output:
Throwing!
Collecting garbage.
Unobserved task exception occured in finalizer.
Test exception
Done collecting garbage.
Nhưng nếu tôi nhận xét ra dòng TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException
chương trình vẫn chạy đến khi kết thúc. Trong trường hợp này, đầu ra là:
Throwing!
Collecting garbage.
Done collecting garbage.
Tại sao ứng dụng không gặp sự cố trong trường hợp này?