8

Bütün bunlar, yukarıdaki konuyla ilgili pek çok soru var ama bunun yeni bir soruya varmak için yeterince farklı olduğuna inanıyorum. Aşağıdaki Task ve Status çeşitli görev ile başa çıkmak için bir devam var; TaskStatus.RanToCompletion, TaskStatus.Canceled ve tabiki TaskStatus.Faulted aracılığıyla. o zaman ne - orada bir AggregateException olasılığıdır devamında içinden atılan gibi kod Bu, tüm iyi çalışıyor, ama ben bu hakkı yapıyorum olsun veya olmasın endişe duyuyorumTPL ve İstisna Yönetimi

Task<bool> asyncTask = Task.Factory.StartNew<bool>(() => 
    asyncMethod(uiScheduler, token, someBoolean), token); 

asyncTask.ContinueWith(task => 
{ 
    // Check task status. 
    switch (task.Status) 
    { 
     // Handle any exceptions to prevent UnobservedTaskException.    
     case TaskStatus.RanToCompletion: 
      if (asyncTask.Result) 
      { 
       // Do stuff... 
      } 
      break; 
     case TaskStatus.Faulted: 
      if (task.Exception != null) 
       mainForm.progressRightLabelText = task.Exception.InnerException.Message; 
      else 
       mainForm.progressRightLabelText = "Operation failed!"; 
     default: 
      break; 
    } 
} 

benziyor?

asyncTask numaralı telefonumda Wait'u veya UI iş parçacığına dönüşü engelleyeceğinden devam etmek istemiyorum. devamı içinden istisnaları yakalar için mutlaka

Task parentTask = Task.Factory.startNew(() => 
    { 
     Task<bool> asyncTask = Task.Factory.StartNew<bool>(() => 
      asyncMethod(uiScheduler, token, someBoolean), token); 

     Task continueTask = asyncTask.ContinueWith(task => 
      { 
       // My continuation stuff... 
      } 

     try 
     { 
      continueTask.Wait(); 
     } 
     catch(AggregateException aggEx) 
     { 
      // Some handling here... 
     } 
    }); 

bu bile çalışacak böyle bir şey yapmak zorunda değiliz ki? Burada en iyi uygulama nedir?

Her zamanki gibi, zaman ayırdığınız için teşekkürler.

+0

Aslında bir AggregateException attıklarında "tamamlamaya koştum" görevlerini gördüm. Bu tür bir hata işleme çalışmıyor. Neden sadece bir try/catch kullanmıyorsunuz? –

+0

Arka plan iş parçacığında veya gerçek devam eden temsilci yönteminde çağrılan yöntemden mi bahsediyorsunuz? – MoonKnight

cevap

12

Sen AggregateException için izliyor delegeler içinde geleneksel try/catch kullanabilir veya yapabilirsiniz öncül TaskContinuationOptions.OnlyOnFaulted seçeneğini kullanarak hatalı olup olmadığını sadece hiç çalışacaktır belirli devamlılık üzerinde zinciri. İkinci yaklaşım, tanımlanması gereken çok temiz görev akışlarına izin verir. Örneğin,

Task myRootTask = ....; 

myRootTask.ContinueWith(rootAntecdent => 
{ 
    // this will only be executed if the antecedent completed successfully, no need to check for faults 
}, 
TaskContinuationOptions.OnlyOnRanToCompletion); 

myRootTask.ContinueWith(rootAntecedent => 
{ 
    // this will only be executed if the antecedent faulted, observe exception and handle accordingly 
}, 
TaskContinuationOptions.OnlyOnFaulted); 
2

Msdn sahip oldukça iyi yazılmış "Nasıl" Konuyla ilgili: here

Sen basitçe, o zaman ae.Handle(lambda) içinde nasıl işleneceğini biliyor istisna filtrelemek bir try/catch(AggregateException) bloğu kullanmak fark ve uygulama durdurmak yapacak eğer elverişsiz olan bazı sol varsa.

+0

Bağlantınızın sağladığı gibi örneklerin farkındayım ve ecstion handling _this way_ ile ilgili bir sorun yok. Benim meselem, devamlılıktan atılan istisnaların, bütün devamlılık delegesini bir deneme avcısıyla kapatmadan nasıl ele alacağıdır, o zaman yine tek yol bu olabilir. Microsoft oyuncak kodu en iyi uygulama değil, gerçek dünya kodu için en iyi kuralları bilmek istiyorum. Şerefe. Bağlantı için – MoonKnight

+0

+1. Çok yararlı – SleepyBoBos

+0

OP, Wait kullanmadan bunu nasıl yapacağını bilmek istiyor. Örneklerin tümü Görev İçin Bekler. Bunu [http://msdn.microsoft.com/en-us/library/dd997415.aspx] bağlantısını deneyin. –