Extension method per la classe Task per gestire i metodi async
-
martedì 26 marzo 2013 09:53
Ciao a tutti,
so migrando un progetto al framework 4.5
ora mi ritrovo ad avere tutte le chiamate in una formula simile a questo metodo
await adminServiceWrapper.GetAuditSummary(App.UtenteLoggato.IDInterno, App.DataLavorativaPrecedente.Date, dpFrom.SelectedDate.Value, dpTo.SelectedDate.Value) .ContinueWith(res => { Dispatcher.BeginInvoke(() => { if (res.IsFaulted) { App.HandleException(res.Exception); } else { DataItems.ItemsSource = res.Result ; DataItems.DataContext = res.Result; } }); });
Volevo creare un extensionmethod per wrappare la parte di dispatcher e il controllo dell'exception...
Io ho iniziato a scrivere il metodo ma non so come fare se l'invoke non è necessario
public static class TaskExtension { public async static System.Threading.Tasks.Task ContinueWithDispatcher<TResult>(this System.Threading.Tasks.Task task, System.Action<System.Threading.Tasks.Task<TResult>> continuationAction) { if (task.IsFaulted) { App.HandleException(task.Exception); } else { if (App.Current.RootVisual.Dispatcher.CheckAccess()) { App.Current.RootVisual.Dispatcher.BeginInvoke(continuationAction); } else { App.Current.RootVisual.Dispatcher.BeginInvoke(continuationAction); //<- che devo fare qui?? } } }
Qualche suggerimento?
Grazie ciao
Tutte le risposte
-
martedì 26 marzo 2013 18:21
-
martedì 2 aprile 2013 08:25
aspetto che termini la prima esecuzione e poi dico di continuare.... è sbagliato fare cosi?
Grazie ciao
-
martedì 2 aprile 2013 08:36
-
martedì 2 aprile 2013 12:15
ah ok.....però ho una domanda allora da farti.....se io uso continuation so se il metodo chiamato ha tirato un exception o meno (diciamo se il task ha fallito), se io uso await devo mettere il mio blocco di codice sotto try/catch giusto?
Esiste inoltre un modo per evitare di dover chiamare il dispatcher per aggiornare elementi bindati alla ui?
Grazie ciao
-
martedì 2 aprile 2013 12:32
Ciao Paolo,
You wrote on 02/04/2013 :
ah ok.....però ho una domanda allora da farti.....se io uso continuation so se il metodo chiamato ha tirato un exception o meno (diciamo se il task ha fallito), se io uso await devo mettere il mio blocco di codice sotto try/catch giusto?
esattamente, come nel codice "normale"
Esiste inoltre un modo per evitare di dover chiamare il dispatcher per aggiornare elementi bindati alla ui?Se usi una continuation devi dare alla continuation lo scheduler giusto (e non ti serve await davanti), altrimenti sei già bnel thread giusto con async/await.
.m
blog @ //milestone.topics.it -
mercoledì 3 aprile 2013 09:24
grazie mille... sto sistemando il mio codice.....una domanda se io ho 3 chiamate a servizi differenti per caricarle contemporanetamente il metodo migliore (con async/await)
è sempre
Task[] taskList = new Task[2];
Task t1 = ....
Task t2 = ...
await Task.WhenAll(taskList);
//prendo i risultati?
Grazie ciao
-
mercoledì 3 aprile 2013 09:59