2011-02-10 17 views
5

İlk bölümün başarısız olması durumunda bir görevin devam etmesini engellemeye çalışıyorum.Task.ContinueWith İstisnasıyla Önleme

Benim kod benziyor:

Task listener = Task.Factory.StartNew(openConnection).ContinueWith((t) => listenForNumber()); 

    void openConnection() 
    { 
     try 
     { 
      //stuff 
     } 
     catch 
     { 
      //morestuff 
     } 
    } 

    void listenForNumber() 
    { 
     //even more stuff 
    } 
OpenConnection() Ben ContinueWith((t) => listenForNumber(),TaskContinuationOptions.NotOnFaulted);

Ama hiçbir başarı, herhangi bir yardım çalıştı

catch bloğu girerse

Şimdi listenForNuber() yürütülmemesi gerektiğini ? :(

Teşekkür

+3

Bu catch bloğundaki istisnayı yeniden düzenler veya yutuyor musunuz? –

cevap

8

TaskContiuationOptions.NotOnFaulted senin yöntem hatalı sürece hiçbir etkisi de yürütme sırasında atılan bir istisna işlenmeyen yani edildi.

yakalamak bloğunda

, sen özel durum atması gerektiğini sahip açıkçası olacak (ve işinizi gerçekleştirdikten sonra throw; ifadesini kullanarak yığın izini koru (bazı temizleme işlemleri) - aksi halde istisna tekrar atılmayacaktır, bu nedenle yönteminiz 'hatalı' olarak kabul edilmeyecektir.

+0

Tamam ancak, özel durumu yeniden düzenlersek, yutmak için en iyi yer nerede (ve nasıl) bu yüzden kullanıcı kodu tarafından işlenmemiş bir AggregatedExeption veya istisna alamıyorum? Her şey daha önce ilk yakalama bloğunda yapıldığı için tekrar ele almam gerekmiyor. – Ekoms

+0

@Ekoms: Bildiğim kadarıyla, AggregateException yalnızca görevin 'Sonuç' özelliğine erişiyorsanız atılır. Bu istisnayı yutabildiğiniz tek nokta bu olmalı, ancak önce gerçekten beklenmedik bir istisna değil, yutmayı amaçladığınız istisna olup olmadığını kontrol etmelisiniz. – ShdNx

1

Özel yöntemi görev yönteminize atmanız gerekir. Bir istisnayı yakalamadığı sürece, yöntemin başarısız olduğunu bilmiyor.

Hatalı durum için hala bir devam yöntemine sahip olmanız gerekecektir. Bu istisnayı günlüğe kaydeder basit bir yöntem olabilir.

İstisna için bir devam yönteminiz yoksa, görev yönteminiz bir istisna atarken uygulamanızda işlenmeyen özel durumlar elde edersiniz.

2

Bir uzantı yöntemi yardımcısı oluşturun. Herhangi bir kodu çalıştırmadan önce PropagateExceptions() uzantı yöntemini çağırınız. Görev iptal edildiyse, PropagateExceptions() yöntemi de yeniden düşünecektir.

İlgili konular