Trong các phiên bản trước của MonoTouch, tôi đã sử dụng để làm điều này để bỏ qua trường hợp ngoại lệ không quan sát được:Làm thế nào để bỏ qua các ngoại lệ không được quan sát với async/await trong MonoTouch?
TaskScheduler.UnobservedTaskException += delegate(object sender, UnobservedTaskExceptionEventArgs e) {
Console.WriteLine (e);
e.SetObserved();
};
Cho dù đó là một thói quen tốt là gây tranh cãi nhưng tôi muốn biết để đạt được tác dụng tương tự với async
/await
từ khóa now officially supported in Xamarin.iOS 6.4.
Đây là mã tôi sử dụng để thử nghiệm:
async void OnClick (object sender, EventArgs e)
{
await Task.Run (() => { throw new Exception(); });
}
Khi tôi chạy nó, gỡ rối dừng lại ở AsyncVoidMethodBuilder
:
Tôi đọc mà .NET 4.5 được cho là changed the behaviour so unobserved exceptions don't crash the app -Nhưng này không giúp đỡ nếu ngoại lệ được đăng lên bối cảnh đồng bộ hóa UIKit nơi tôi không thể xử lý chúng.
Có cách nào bỏ qua các ngoại lệ không được quan sát từ await
trong MonoTouch không?
Bạn đề cập đến nó "tạm dừng" trong "AsyncVoidMethodBuilder'. Điều đó có nghĩa rằng nếu bạn nhấn tiếp tục ngoại lệ cuối cùng bị nuốt bởi người xử lý của bạn? Đây có phải là trường hợp chỉ trình gỡ lỗi tạm dừng ngoại lệ này không? Ngoài ra, bài viết bạn tham chiếu bao gồm một số cài đặt app.config để thực hiện công việc ngoại lệ như .NET 4. Điều đó có hữu ích không? –
@Brad: Nếu tôi nhấn tiếp tục, quá trình sẽ bị treo do ngoại lệ được đưa lại trên chuỗi giao diện người dùng theo 'UIKitSynchronizationContext' cơ bản. Các thiết lập cấu hình có để làm cho hành vi * chặt chẽ hơn * vì vậy họ không nên giúp đỡ. Bạn nêu ra một điểm hợp lệ mặc dù; trong các phiên bản trước, tôi đã có thể nắm bắt các ngoại lệ trong trình xử lý không được giám sát ngay cả khi đã được ném vào chuỗi giao diện người dùng. –
Có nhiều trình xử lý không được giám sát khác nhau, cho Công việc, AppDomain, v.v. Hãy thử sử dụng một trình xử lý cụ thể cho giao diện người dùng. Đang chờ trả lời các ngoại lệ trên SynchronizationContext –