Einige von uns bevorzugen es, in einem Ausnahmestil zu codieren. Wenn Sie jedoch auf eine Task Parallel Library-Aufgabe warten und die Task eine Ausnahme ausgelöst hat, wird auch eine Ausnahme für den aufrufenden Thread ausgelöst. Gibt es einen (vorzugsweise Standard) Weg, um dieses Verhalten zu vermeiden und nur die Antwort auf Ausnahmen zu überprüfen, wenn Sie es zurückbekommen?Gibt es eine Möglichkeit, auf eine TPL-Aufgabe zu warten, ohne eine Ausnahme auszulösen?
Antwort
können Sie Task.WaitAny wie verwenden:
var task = Task.Run(() =>
{
// ...
throw new Exception("Blah");
});
Task.WaitAny(task);
if (task.IsFaulted)
{
var error = task.Exception;
// ...
}
else if (task.IsCanceled)
{
// ...
}
else
{
// Success
}
Basierend auf dem, was Sie geschrieben haben, könnte die Ausnahme abfangen und die Überprüfung der IsFaulted
Eigenschaft Ihre Lösung sein? IsFaulted
Ich ging mit dem Task.WaitAny Ansatz. Um Ihnen einen Kontext dafür zu geben, warum der Code aufgerufen wurde, war ein Bibliothekscode, den ich nicht ändern konnte und der von außerhalb von TPL aufgerufen wurde, aber Ausnahmen waren ziemlich üblich und obwohl sie gehandhabt werden mussten, gab es eine Menge Lärm damit umzugehen, wenn man auf "Pause bei Ausnahme" klopft, was ich die ganze Zeit mache. –
Die Ausnahme in der Task abfangen und im Ergebnis zurückgeben?
var task1 = Task.Factory.StartNew(() =>
{
try
{
throw new MyCustomException("I'm bad, but not too bad!");
}
catch(Exception ex)
{
return new Result { Error = ex };
}
});
Leider ist diese Funktionalität nicht integriert. Verwenden Sie diese Problemumgehung:
Sie können dies zu einer Erweiterungsmethode machen.
Sie können nicht auf einem fehlerhaften Aufgabe warten, ohne eine Ausnahme zu erhöhen. Aber Sie können zu dieser Aufgabe auf eine Fortsetzung warten, die nur beenden, nachdem die ursprüngliche Aufgabe ohne Auslösen einer Ausnahme beendet:
public static Task SwallowExceptions(this Task task)
{
return task.ContinueWith(_ => { });
}
faultedTask.SwallowExceptions().Wait();
if (faultedTask.IsFaulted)
{
// handle exception
}
Wenn Ihre Aufgabe einen Wert zurückgibt, Sie, dass in der Extension-Methode darstellen und Rückkehr der tatsächliche Wert, wenn es keine Ausnahmen oder den Standardwert gab, wenn es gab:
public static Task<T> SwallowExceptions<T>(this Task<T> task)
{
return task.ContinueWith(completedTask =>
completedTask.IsFaulted
? default(T)
: completedTask.Result);
}
- 1. Gibt es eine Möglichkeit, Runnable Run() eine Ausnahme auszulösen?
- 2. Gibt es eine Möglichkeit, einen Stack-Trace auszugeben, ohne eine Ausnahme in Java auszulösen?
- 3. Gibt es eine Methodenreferenz, um eine Ausnahme auszulösen?
- 4. Casperjs - Gibt es eine Möglichkeit, auf n Sekunden zu warten?
- 5. Gibt es eine Möglichkeit, eine Gleitkommazahl ohne ldexp zu erstellen?
- 6. Gibt es eine Möglichkeit, CSS-Keyframe-Animation mit JS auszulösen?
- 7. Gibt es eine Möglichkeit, Google Maps-Ereignisse manuell auszulösen?
- 8. Gibt es eine Möglichkeit, Gestenereignisse unter Mac OS X auszulösen?
- 9. Gibt es eine Möglichkeit, asynchron auf eine Zukunft in Boost Asio zu warten?
- 10. Gibt es eine Möglichkeit, halbtransparent auf eine PictureBox zu malen?
- 11. Gibt es eine Möglichkeit, Mehrfacheinspritzung zu propagieren?
- 12. Gibt es eine Möglichkeit, Theano ohne Nvidia zu installieren
- 13. Gibt es eine Möglichkeit, schleichende Linie ohne Flackern zu erzeugen?
- 14. Gibt es eine Möglichkeit, Winkel 2 ohne Modullader zu verwenden?
- 15. Gibt es eine Möglichkeit, Typdeklarationen zu erweitern?
- 16. Gibt es eine Möglichkeit, ruby1.9 aufzurufen, ohne Rubygems zu laden?
- 17. Gibt es eine Möglichkeit, "träge" zu lesen?
- 18. Gibt es eine Möglichkeit, eine leere .mo-Dateivorlage zu erstellen?
- 19. Gibt es eine Möglichkeit, eine SQLAlchemy Connection zu testen?
- 20. Gibt es eine Möglichkeit, Asio ohne Boost arbeiten zu lassen?
- 21. Gibt es eine Möglichkeit, Tastaturereignisse ohne JFrame zu erhalten?
- 22. Gibt es eine Möglichkeit, einen Sicherungspunkt ohne Transaktion zu erstellen?
- 23. Gibt es eine Möglichkeit, Maschineneigenschaften ohne Vagabund zu überprüfen?
- 24. Gibt es eine Möglichkeit, JNLP ohne Zertifikate zu machen?
- 25. Gibt es eine Möglichkeit, Powershell warten zu lassen, bis eine Installation abgeschlossen ist?
- 26. Gibt es eine Möglichkeit, Formularantwort zu ignorieren?
- 27. Gibt es eine Möglichkeit, eine CABasicAnimation anzuhalten?
- 28. Gibt es eine Möglichkeit, onPanResponderMove zu verwalten?
- 29. Gibt es eine Möglichkeit, Schaltflächenformularfunktion in IE10 zu unterstützen/shim?
- 30. Gibt es eine Möglichkeit, "durch eine Liste zu führen"?
Also im Grunde fragen Sie, ob einige Code eine Ausnahme warf, gibt es eine Möglichkeit, es zu erkennen, ohne es zu fangen? –
Sind Sie absolut sicher, dass Sie * auf die Aufgabe * warten müssen? Ich würde dir empfehlen '' ContinueWith (...) 'was auch immer du nach dem Wait Call gemacht hast. –
Dies ist eine Instanz, in der Sie Fortsetzungen verwenden sollten, um den Status der Vorgängeraufgabe abzufragen. Die Fortsetzung ist für TPL von grundlegender Bedeutung. Vermeiden Sie Hacking um sie herum. Genauer gesagt ist das Verschlucken von Ausnahmen ein Code-Geruch. – Gusdor