Istnieje kilka sposobów na obserwowanie wyjątków zgłaszanych w ramach zadań. Jednym z nich jest w ContinueWith z OnlyOnFaulted:Obserwowanie wyjątków zadań wewnątrz kontynuacji
var task = Task.Factory.StartNew(() =>
{
// Throws an exception
// (possibly from within another task spawned from within this task)
});
var failureTask = task.ContinueWith((t) =>
{
// Flatten and loop (since there could have been multiple tasks)
foreach (var ex in t.Exception.Flatten().InnerExceptions)
Console.WriteLine(ex.Message);
}, TaskContinuationOptions.OnlyOnFaulted);
Moje pytanie: Czy wyjątki zostają automatycznie obserwowane po rozpoczęciu failureTask czy też tylko stać obserwowana kiedyś „dotyk” ex.Message?
Co masz na myśli przez przestrzegane? Twój KontynuacjaZ delegatem zostanie wywołany tylko raz, jeśli o to ci chodzi, niezależnie od tego, czy uzyskasz dostęp do obiektu wyjątku, czy nie. –
Być może ma na myśli "czy wyrzuci wyjątek, jeśli po prostu wywołasz' OnlyOnFaulted' bez względu na dostęp do 't.Exceptions'"? – user7116
Jeśli nie "zauważysz" wyjątków (to jest terminologia Microsoft) wyrzuconych z Tasks, wtedy garbage collector rzuci je dla Ciebie w późniejszym czasie. Moja kontynuacja z delegatem na pewno mógł zostać wywołany wiele razy (jeśli wiele zadań z mojego głównego zadania generuje wyjątki) ... lub może zostać wywołany z drzewem AggregateException z wszystkimi zgłaszanymi wyjątkami? – davenewza