Aus der Microsoft-Dokumentation sollte die System.Timers.Timer
verstrichene Methode alle Ausnahmen verschlingen.System.Timers.Timer stürzt bei Ausnahme ab
Die Komponente Timer fängt alle Ausnahmen ab, die von Ereignishandlern für das Ereignis Elapsed ausgelöst werden, und unterdrückt sie.
https://msdn.microsoft.com/en-us/library/system.timers.timer.aspx
jedoch, wenn eine Ausnahme erzeugt wird, unter Verwendung eines Verfahrens async void
Zeichnung, die die Anwendung abstürzt. Siehe unten stehenden Code:
class Program
{
static void Main(string[] args)
{
Timer timer = new Timer(100);
//timer.Elapsed += On_ElapsedSync; //A
//timer.Elapsed += On_ElapsedAsync; //B
timer.Elapsed += On_ElapsedAsyncVoid; //C
timer.Start();
Console.WriteLine("Running...");
Console.ReadLine();
}
private static void On_ElapsedSync(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Throwing...");
throw new Exception("My Exception");
}
private static void On_ElapsedAsync(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Throwing...");
Task.Run(() => throw new Exception("Async Exception"));
}
private static async void On_ElapsedAsyncVoid(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Throwing...");
await Task.Run(() => throw new Exception("Async Exception"));
}
}
Die Zeilen kommentiert A und B stürzen die Anwendung nicht ab. Die Zeile kommentierte C.
Warum ist das der Fall?
Yuck, Sie machen es klingt, als ob es ein gutes Feature ist. Es zählt zu den schlechtesten .NET 1.0-Entscheidungen. Und sicher, funktioniert nicht, der Code, der das Ereignis auslöst, ist bis zum Abschluss der Aufgabe längst verschwunden. Es kann also nichts fangen. Eine Async-Void-Methode ist ein Code für den Code "Fire-and-Forget". –
Ich stimme zu, sie sollten alle werfen. Aber ich war überrascht, als der Async auf mich wartete. –
['async void' Ausnahmen können nicht mit normalen Mitteln abgefangen werden] (https://msdn.microsoft.com/en-us/magazine/jj991977.aspx). –