1

Ich weiß nicht, wie ich richtig eine Ausnahme von einer Aufgabe auf den Thread, der diese Aufgabe erstellt propagieren sollte:Wie propagiert man eine Exception von einer Aufgabe/einem Thread zur Methode, die diese Aufgabe in C# erstellt hat?

private void threadMT() 
{ 
    Task task; 
    try 
    { 
     task = new Task(() => 
     { 
      throw new Exception("blabla"); 
     }); 
     task.Start(); 

     while(!task.IsCompleted) 
      Thread.Sleep(500); 
     if (task.IsFaulted) 
      throw task.Exception; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

Wenn diese Zeile erreicht ist:

throw new Exception("blabla"); 

die App hält, dass der Spruch Ausnahme wird nicht behandelt. Kann es zurück zur Methode propagiert werden?

Danke im Voraus.

Antwort

1

Der einfachste Weg für Sie eine Ausnahme von einem auf dem Thread-Pool ausgeführt Task zu propagieren ist, es zu drehen, um tatsächlich ein Task zurück, die Sie await können:

public async Task AwaitOnTaskAsync() 
{ 
    try 
    { 
     await DoStuffWithThreadAsync(); 
    } 
    catch (Exception e) 
    { 
    } 
} 

public Task DoStuffWithThreadAsync() 
{ 
    return Task.Run(() => { throw new Exception("blabla"); }); 
} 

await werden auszupacken stellen Sie sicher, die Ausnahme aus der Task, so dass Sie eine try-catch darauf anwenden können.

Seite Hinweis - Verwenden Sie nicht den Task Konstruktor, sondern verwenden Sie Task.Run, um eine "heiße Aufgabe" (eine, die bereits gestartet wurde) zurückzugeben. Es macht keinen Sinn, eine Task zu erstellen, die Sie später bei der Verwendung von Thread.Sleep aktiv blockieren, entweder synchron ausführen oder async-await verwenden, um asynchron auf die Aufgabe zu warten.

+0

Dieser Code generiert immer noch eine "unbehandelte Ausnahme". –

+0

Haben Sie die ersten Ausnahmen in VS aktiviert? –

+0

Keine Ausnahmen mehr, wenn ich CLR-Ausnahmen in VS-Optionen deaktiviere. Ich bin mir nicht sicher über alle Konsequenzen der Deaktivierung? –

Verwandte Themen