2014-09-08 13 views
8

Ho il seguente codice nella Xamarin (testato in iOS):Xamarin: Le eccezioni sollevate da compiti non vengono propagate

private static async Task<string> TaskWithException() 
{ 
    return await Task.Factory.StartNew (() => { 
     throw new Exception ("Booo!"); 
     return ""; 
    }); 
} 

public static async Task<string> RunTask() 
{ 
    try 
    { 
     return await TaskWithException(); 
    } 
    catch(Exception ex) 
    { 
     Console.WriteLine (ex.ToString()); 
     throw; 
    } 
} 

Invocare questo come await RunTask(), non generare l'eccezione dal metodo TaskWithException, ma il metodo di cattura in RunTask non viene mai colpito. Perché? Mi aspetto che il catch funzioni come nell'esecuzione di async/await di Microsoft. Mi sto perdendo qualcosa?

+1

Utilizzate '.Result',' Wait' o 'WaitAll' in qualsiasi punto del codice, facendo riferimento direttamente o indirettamente all'attività restituita da' RunTask'? – Noseratio

+0

Funziona come previsto in un'app console in VS2013. –

+0

Il codice è stato chiamato dal costruttore di una vista Form Xamarin. Non pensavo che il dettaglio fosse rilevante, ma sembra che avviare un'attività come questa dal costruttore non attivi il gestore delle eccezioni. – madaboutcode

risposta

5

Non è possibile effettuare il await un metodo all'interno di un constructor, ecco perché non è possibile catturare lo Exception.

Per prendere il Exception è necessario await l'operazione.

ho qui due modi per chiamare un metodo asincrono dal costruttore:

1.ContinueWith soluzione

RunTask().ContinueWith((result) => 
{ 
    if (result.IsFaulted) 
    { 
     var exp = result.Exception; 
    }  
}); 

2. Xamarin Forms

Device.BeginInvokeOnMainThread(async() => 
{ 
    try 
    { 
     await RunTask();  
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine (ex.ToString()); 
    }  
}); 

iOS

InvokeOnMainThread(async() => 
{ 
    try 
    { 
     await RunTask();  
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine (ex.ToString()); 
    }  
}); 
+2

Grazie per aver dedicato del tempo a rispondere a questa vecchia domanda. Da quello che ricordo, abbiamo usato il n. 2 per risolvere il problema in quel momento. Vergognatevi per non aver seguito e risposto alla mia stessa domanda! :( – madaboutcode

Problemi correlati