2013-07-25 31 views
7

, ben gözlenemeyen istisnaları göz ardı etmek böyle yapardı: Bu iyi bir uygulama tartışmalıdır olsunMonoTouch'da async/wait ile denetlenmeyen istisnalar nasıl yok sayılır? MonoTouch önceki sürümlerinde

TaskScheduler.UnobservedTaskException += delegate(object sender, UnobservedTaskExceptionEventArgs e) { 
    Console.WriteLine (e); 
    e.SetObserved(); 
}; 

ama async/await anahtar kelimeler ile aynı etkiyi elde etmek bilmek istiyorum now officially supported in Xamarin.iOS 6.4. İşte

Ben test için kullanmak kodudur: Onu çalıştırdığınızda

async void OnClick (object sender, EventArgs e) 
{ 
    await Task.Run (() => { throw new Exception(); }); 
} 

, ayıklayıcı AsyncVoidMethodBuilder yılında duraklar:

enter image description here

Bu -ama sözde changed the behaviour so unobserved exceptions don't crash the app o .NET 4.5 okumak istisnaların UIKit eşitleme bağlamına gönderilip gönderilmediği durumlarda yardımcı olmaz.

MonoTouch içinde await gelen gözlemlenmemiş istisnalar görmezden bir yolu var mı?

+1

"AsyncVoidMethodBuilder" içindeki "duraklamalar" dan söz ediyorsunuz. Bu devam ederseniz istisna devam ederse sonunda işleyiciniz tarafından yutulur? Bu, yalnızca bu hata ayıklayıcının bu özel durumun sonlandırıldığı bir durum mu? Ayrıca, başvuruda bulunduğunuz makalede, .NET 4. gibi istisna çalışmalarını yapmak için bazı app.config ayarları yer alır. Bu yararlı olur mu? –

+0

@Brad: Devam edersem devam edersek, bu işlem çöküyor çünkü istisna UI iş parçacığı üzerinde 'UIKitSynchronizationContext' temel alınarak yeniden atılıyor. Yapılandırma ayarları, daha sıkı davranmak için vardır * bu yüzden yardım etmemeleri gerekir. Ancak geçerli bir noktaya yükselttiniz; Önceki sürümlerde, UI iş parçacığı üzerinde atılmış olsa da, Gözetlenmeyen işleyicideki istisnaları yakalayabildim. –

+1

Görevler, AppDomain vb. Için çeşitli Gözlemlenmemiş işleyiciler vardır. UI'ye özgü olanı kullanmayı deneyin. Bekleme SynchronizationContext –

cevap

7

Bu async void yöntemlerin doğru davranıştır: onlar async void yöntem başlatan zamanda etkin olduğu SynchronizationContext üzerine istisna yükseltmek için gerekiyordu vardır.

değişiklik farkedilmemiş görev istisna dışında sadece uğraşıyor .NET 4.5 belirtildiği ve async void yöntemlere geçerli değildir. (Microsoft) .NET dünyasında

, farklı SynchronizationContext uygulamaları farklı üst düzey hata kaldırmaz. WPF, WinForms ve ASP.NET hepsi genellikle Application tip bir parçası olarak, bu hatayı işleme farklı yolları vardır.

Mono UIKit API'sini inceledim - normal bir Mono kullanıcısı olmamasına rağmen - UIApplication numaralı sürümde herhangi bir üst düzey hata işleme bulamadı ve UIKitSynchronizationContext genel olarak (veya en azından belgelenmemiş) gibi görünüyor. async void yöntemleri için istisna işleme davranışı (my MSDN article bkz fazla bilgi için) olurdu sadece olay işleyicileri gibi olacak şekilde tasarlanmıştır:

Bu sorunun şu an bir başka yolu

. Yani soruyu başka bir soruyla cevaplayabilirsiniz: UIKit'te bu istisnayı nasıl ele alırsınız?

void OnClick (object sender, EventArgs e) 
{ 
    throw new Exception(); 
} 

Tam olarak aynı şekilde async void istisna müdahale edecek. Eğer UnobservedTaskException kullanmaya devam etmek istiyorsanız

Alternatif olarak, sadece görev istisna gözlemlemek olamaz (sizin async void kodunda, Task.Run bir istisna alır bir görev verir ve await kullanarak bu gözlemliyoruz):

void OnClick (object sender, EventArgs e) 
{ 
    Task.Run(() => { throw new Exception(); }); 
} 

Ancak, tüm işlemlerinizi gerçekleştiren olay işleyicileri için async void ve (en sonunda) await kullanmanızı öneririm. Bu, programınızın düzgün çalışmayı durdurduğu ve nedenini bilmediğiniz herhangi bir "sessiz hataları" (göz ardı edilen görev istisnaları) almamanızı sağlayacaktır.

+0

üzerindeki istisnaları bekler Teşekkürler, bu mükemmel bir anlam taşır! Bunu bekleyerek bir görev istisnası gözlemlediğimin farkında değildim. Şimdi sadece UIKit istisnalarını nasıl kullanacağımı biliyordum :-) –

+1

Dan, Bu UIKit istisnalarını gözlemlemek için herhangi bir yol buldunuz mu? –

+1

Merhaba Dan, aynı soru, UIKit istisnalarını ele almayı başardınız mı? – Fabien