Was ist der beste Weg, um eine Ausnahme in Task abzufangen?
Mit System.Threading.Tasks.Task<TResult>
habe ich zur Verwaltung der Ausnahmen, die geworfen werden konnte. Ich bin auf der Suche nach der beste Weg, das zu tun. So weit, ich habe eine base-Klasse, verwaltet alle die nicht abgefangene Ausnahmen innerhalb der call of .ContinueWith(...)
Frage ich mich, ob es einen besseren Weg, tun, tun. Oder sogar, wenn es ist ein guter Weg, das zu tun.
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
*/
});
}
}
InformationsquelleAutor der Frage JiBéDoublevé | 2012-10-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei Möglichkeiten, wie Sie dies tun können, abhängig von der version der Sprache, die Sie verwenden.
C# 5.0 und höher
Können Sie die
async
underwarten
keywords zu vereinfachen, ein tolles Angebot für Sie.async
undawait
wurden eingeführt in die Sprache zu vereinfachen, mit dem Task Parallel Libraryverhindern, dass Sie mitContinueWith
und so dass Sie weiterhin das Programm in einem top-down-Weise.Weil dieser, können Sie einfach eine
try
/catch
- block zum abfangen der Ausnahme, etwa so:Beachten Sie, dass die Methode Kapselung der oben muss verwenden, die
async
keyword verwendet, so können Sieawait
.C# 4.0 und unten
Können Sie die Ausnahmen behandeln mit der
ContinueWith
überlastung , nimmt einen Wert aus derTaskContinuationOptions
- Aufzählungetwa so:Den
OnlyOnFaulted
Mitglied derTaskContinuationOptions
- enumeration gibt an, dass die Fortsetzung sollte nur ausgeführt werden, wenn die Vorangehende Aufgabe hat eine Ausnahme ausgelöst.Natürlich, Sie können mehr als einen Anruf zu
ContinueWith
aus der gleichen Vorgeschichte, den Umgang mit den nicht-Ausnahmefall:InformationsquelleAutor der Antwort casperOne
Können Sie einige benutzerdefinierte Aufgabe der Fabrik, die produzieren Aufgaben mit exception-handling, Verarbeitung eingebettet ist. So etwas wie dieses:
Können Sie vergessen, über Ausnahmen Verarbeitung für Aufgaben, hergestellt aus diesem Werk in Ihrem client-code. In der gleichen Zeit, die Sie noch warten können, Beendigung der Aufgaben oder die Verwendung in Feuer-und-Vergessen-Stil:
Aber wenn ehrlich gesagt, ich bin nicht wirklich sicher, warum Sie wollen, um Abschluss-handling-code. In jedem Fall ist diese Entscheidung hängt von der Logik der Anwendung.
InformationsquelleAutor der Antwort ZarathustrA