2014-06-26 30 views
11

Asenk metotlarının bekledikleri zamana kadar normal yöntemler gibi davranmaları gerektiğini düşündüm.Beklenmeyen uyumsuzluk yöntemleri neden istisna atmıyor?

Bu neden bir istisna alamıyor?

Beklenmeyen bir istisnayla karşılaşmanın bir yolu var mı?

using System; 
using System.Threading.Tasks; 

public class Test 
{ 
    public static void Main() 
    { 
     var t = new Test(); 
     t.Helper(); 
    } 

    public async Task Helper() 
    { 
     throw new Exception(); 
    } 
} 
+1

Tarihsel bir not olarak, istisnalar başlangıçta beklediğiniz gibi "doğrudan" olarak yükseltildi. Ancak, bu davranış kafa karıştırıcıydı, çünkü 'bekleyiş' öncesi ve sonrası istisnalar farklı davrandı ve eğer 'bekle' şartlı olsaydı * gerçekten kafa karıştırıcı olabilirdi. –

+0

@StephenCleary Ne zaman değiştirildi? CTP aşamasındayken? – i3arnon

+1

@ I3arnon: Yes; IIRC sadece ilk CTP bu şekilde davrandı. –

cevap

14

bir async yöntemi içinde atılan bir istisna, tasarım gereği, döndü görev içinde saklanır.

  1. await görev: await t.Helper();
  2. Wait görev: t.Helper().Wait();
  3. sonra görevin Exception özelliğini kontrol görevi tamamlanmıştır: var task = t.Helper(); Log(task.Exception);
  4. yapabilirsiniz istisna ellerini almak için Özel durumu ele alan bu görevin devamı: t.Helper().ContinueWith(t => Log(t.Exception), TaskContinuationOptions.OnlyOnFaulted);

En iyi seçeneğiniz birincisidir. Sadece await görevi ve istisnayı kullanın (bunu yapamayacağınız özel bir neden olmadıkça). Daha fazla bilgi için Task Exception Handling in .NET 4.5

İlgili konular