2014-06-26 17 views
11

Pensavo che i metodi asincroni dovessero comportarsi come i metodi normali fino a quando non sono arrivati ​​ad un'attesa.Perché i metodi asincroni non aspettati non generano eccezioni?

Perché questo non genera un'eccezione?

C'è un modo per far lanciare l'eccezione senza attendere?

using System; 
using System.Threading.Tasks; 

public class Test 
{ 
    public static void Main() 
    { 
     var t = new Test(); 
     t.Helper(); 
    } 

    public async Task Helper() 
    { 
     throw new Exception(); 
    } 
} 
+1

Come nota storica, le eccezioni sono state inizialmente sollevate "direttamente" come previsto. Tuttavia, questo comportamento era fonte di confusione perché le eccezioni prima e dopo l'attesa si sarebbero comportate diversamente, e avrebbe potuto ottenere * veramente * confusione se l'attesa era condizionata. –

+0

@StephenCleary Quando è stato cambiato? Durante la fase CTP? – i3arnon

+1

@ I3arnon: Sì; IIRC solo il primo CTP si è comportato in questo modo. –

risposta

14

Un'eccezione lanciata all'interno di un metodo di async è, in base alla progettazione, memorizzati all'interno del compito restituito. Per mettere le mani su l'eccezione è possibile:

  1. await il compito: await t.Helper();
  2. Wait il compito: t.Helper().Wait();
  3. Controllare Exception proprietà del compito dopo il compito è stato completato: var task = t.Helper(); Log(task.Exception);
  4. Aggiungere una continuazione a quell'attività che gestisce l'eccezione: t.Helper().ContinueWith(t => Log(t.Exception), TaskContinuationOptions.OnlyOnFaulted);

L'opzione migliore è la prima. Semplicemente await l'attività e gestire l'eccezione (a meno che non vi sia un motivo specifico per cui non è possibile farlo). Altro in Task Exception Handling in .NET 4.5

Problemi correlati