Bir Görev oluşturursanız ve hiçbir zaman arama yapmazsanız task.Wait()
veya a sonucunu almaya çalışmazsanız Task<T>
, görev çöp toplayıcı tarafından toplandığında, sonlandırma sırasında uygulamanızı yırtar. Ayrıntılar için , MSDN'nin TPL'de Özel Durum İşleme hakkındaki sayfasına bakın .
Buradaki en iyi seçenek, istisnayı "ele almaktır". Bu, devam ettirme yoluyla yapılabilir - göreve bir devam ekleyebilir ve oluşan istisnayı günlüğe / yutabilir / vb. Bu, görev istisnalarını günlüğe kaydetmek için temiz bir yol sağlar ve basit bir uzantı yöntemi olarak yazılabilir, yani:
public static void LogExceptions(this Task task)
{
task.ContinueWith( t =>
{
var aggException = t.Exception.Flatten();
foreach(var exception in aggException.InnerExceptions)
LogException(exception);
},
TaskContinuationOptions.OnlyOnFaulted);
}
Yukarıdakilerle, herhangi bir görevin uygulamayı yırtmasını ve günlüğe kaydetmesini şu yolla önleyebilirsiniz:
Task.Factory.StartNew( () =>
{
// Do your work...
}).LogExceptions();
Alternatif olarak, TaskScheduler.UnobservedTaskException'a abone olabilir ve orada işleyebilirsiniz.
Off
seçtiğiniz dört harfli kelime olarak adlandırılan bir sınıfta statik bir saplama yöntemine sahip olun ve bunu tümünü yakalama devamlarınız için kullanın. Bu özel istisnadan kaynaklanan bazı bastırılmış hayal kırıklıklarıyla mücadele etmeye yardımcı olur.