2012-11-07 9 views
5

Temel olarak, C# 'de, await anahtar sözcüğü aracılığıyla beklemede olan eşzamansız yöntemlerden özel durumları yakalamak için merak ediyorum. Örneğin, en önemlisi AwaitSync adı verilen bir yöntemi içeren aşağıdaki küçük konsol programını düşünün. AwaitSync, yürütüldüğünde bir istisna atar bir Görev döndüren TestAsync çağırır. Özel durumu AwaitAsync, 'da yakalamaya çalışıyorum ancak işlenmemiş olan. C# beklenen bir eşzamanlı olmayan yöntemden bir istisnayı nasıl yakalarım?

class Program 
{ 
    static void Main(string[] args) 
    { 
     AwaitAsync(); 
     Console.ReadKey(); 
    } 

    static async Task AwaitAsync() 
    { 
     try 
     { 
      await TestAsync(); 
     } 
     catch (Exception) 
     { 
      Console.WriteLine("Exception caught"); 
     } 
    } 

    static Task TestAsync() 
    { 
     return Task.Factory.StartNew(() => { throw new Exception("Test"); }); 
    } 
} 

nasıl

Ben TestAsync tarafından döndürülen Görev den istisna yakalayabilir ki? Bu örnek bir konsol programı olsa da, gerçek hayattaki sorunum ASP.NET MVC/Web API'sinin kapsamındadır.

DÜZENLEME: istisna terminali kapanmadan önce ben sadece 'İstisna yakalandı' mesajı fark etmedi teknik nedenlerden dolayı, yakalanmaktir çıkıyor. Her durumda, Jon Skeet'in cevabı, await anlayışım ve istisna işleme konusunda çok değerliydi.

+1

Bunun çalışmadığını mı söylüyorsunuz? – jishi

+2

Kodunuzu çalıştırdığımda, "İstisna yakalandı" ifadesini görüyorum. – spender

+0

Bu benim için yakalanmaz. Tekrar kontrol edeceğim. – aknuds1

cevap

10

TestAsync tarafından döndürülen Task ilişkili TaskAwaiter üzerinde GetResult() arayacak await ifadesi için üretilen kodu.

GetResult

, görev hatalı olduğunu fark görevi içinde AggregateException den ilk istisna getirme ve bu fırlatır. vardır (ancak birden istisnaları olan bir görev bekliyor eğer, yalnızca özel eylemleri sürece ilkini göreceksiniz -

net sonuç catch bloğu Görevinizdeki istisnayı yakalamak olacaktır buna çeşitli yaklaşımlar.

İstisnayı iddia ettiğiniz gibi, aslında işlenmeden işe yarayacak gibi görünüyor, kodunuzda gösterdiğiniz şeyden başka bir şey var gibi görünüyor - verdiğiniz kod kesinlikle çalışmalı ve benim için yapar.

+0

Teşekkürler, öğle yemeğinden sonra detaylandırılacaktır. – aknuds1

+0

Bu istisnanın aslında yakalanmış olduğu ortaya çıkıyor, ancak programı bitirmek için bir tuşa basmadan önce onay mesajı konsola yazılmaz. Bu yüzden ilk başta mesajın basıldığını fark etmedim. Tahmin asynchrony biraz alışmak alır :) – aknuds1

+0

İstisnalar ile nasıl ele alındığını açıklama için çok btw teşekkürler, benim anlayışım için çok yararlı. – aknuds1