Sto lavorando a un Web Hook in .NET 4.0 che eseguirà un lambda in modo asincrono e quindi pubblicheremo il risultato su un dato URI quando è finito.Voglio che l'attività gestisca eventuali eccezioni generate, ma trovo difficile impedire loro di raggiungere il genitore
Ho il diritto di funzionare, ma ora voglio che l'attività gestisca tutte le eccezioni generate e trovo difficile impedire loro di raggiungere il genitore.
Ecco parte del mio codice:
private readonly Func<T> _startTask;
private readonly string _responseUri;
public Task<T> Begin()
{
var task = new Task<T>(_startTask);
task.ContinueWith<T>(End);
task.Start();
return task;
}
private T End(Task<T> task)
{
if (task.IsFaulted)
{
return HandleException(task);
}
var result = task.Result;
WebHookResponse.Respond(result, _responseUri);
return result;
}
private T HandleException(Task<T> task)
{
WebHookResponse.HandleException(task.Exception.InnerException, _responseUri);
return null;
}
Una versione alternativa che ho provato chiamate ContinueWith()
due volte per registrare un proseguimento per eseguire OnlyOnRanToCompletion
e uno per l'esecuzione OnlyOnFaulted
. (Non sono sicuro se chiamate ContinueWith()
due volte è corretto.):
public Task<T> Begin()
{
var task = new Task<T>(_startTask);
task.ContinueWith<T>(End, TaskContinuationOptions.OnlyOnRanToCompletion);
task.ContinueWith<T>(HandleException, TaskContinuationOptions.OnlyOnFaulted);
task.Start();
return task;
}
private T End(Task<T> task)
{
var result = task.Result;
WebHookResponse.Respond(result, _responseUri);
return result;
}
private T HandleException(Task<T> task)
{
WebHookResponse.HandleException(task.Exception.InnerException, _responseUri);
return null;
}
Quindi, fondamentalmente voglio un modo per ogni attività gestire le proprie eccezioni tramite una funzione di continuazione. Così com'è, la funzione di continuazione HandlException non viene mai chiamata in nessuno dei precedenti esempi.
Sto causando le eccezioni in un caso di test, e devo menzionare che sto usando una chiamata Tasks.WaitAll(tasks);
su una serie di attività per assicurarmi che tutte le attività siano complete prima di dare le mie asserzioni, e non sono sicuro se quella chiamata fa la differenza su come le eccezioni sono gestite dalle attività. Attualmente WaitAll genera un'eccezione Aggregation che aggrega le eccezioni per ciascuna delle attività perché non vengono gestite dalla funzione di continuazione HandleException.
Non vedo il problema. Che comportamento stai vedendo? –
Siamo spiacenti, la funzione di continuazione HandleException non viene chiamata. An AggregationException viene lanciata da Tasks.WaitAll (tasks); chiamata. Non voglio vedere un AggregationException. Ho appena aggiornato la domanda. –
@Martin Owen Ciao, il mio HandleExceptionContinuation non viene chiamato troppo e il mio evento UnobservedTaskException non viene licenziato anche qui: http://stackoverflow.com/questions/11831844/unobservedtaskexception-being-throw-but-it-is-handled-by- a-taskscheduler-unobser hai trovato qualche soluzione? – newway