W przypadku System.Threading.Tasks.Task<TResult>
muszę zarządzać wyjątkami, które mogą zostać wyrzucone. Szukam najlepszego sposobu, żeby to zrobić. Do tej pory utworzyłem klasę bazową, która zarządza wszystkimi nieprzechwyconymi wyjątkami wewnątrz wywołania.ContinueWith(...)
Zastanawiam się, czy jest na to lepszy sposób. Lub nawet jeśli to dobry sposób na zrobienie tego.
public class BaseClass
{
protected void ExecuteIfTaskIsNotFaulted<T>(Task<T> e, Action action)
{
if (!e.IsFaulted) { action(); }
else
{
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
{
/* I display a window explaining the error in the GUI
* and I log the error.
*/
this.Handle.Error(e.Exception);
}));
}
}
}
public class ChildClass : BaseClass
{
public void DoItInAThread()
{
var context = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew<StateObject>(() => this.Action())
.ContinueWith(e => this.ContinuedAction(e), context);
}
private void ContinuedAction(Task<StateObject> e)
{
this.ExecuteIfTaskIsNotFaulted(e, () =>
{
/* The action to execute
* I do stuff with e.Result
*/
});
}
}