Note: Forums will be making significant UX changes to address key usability improvements surrounding search, discoverability and navigation. To learn more about these changes please visit the announcement which can be found HERE.
Extension method per la classe Task per gestire i metodi async

Domanda Extension method per la classe Task per gestire i metodi async

  • martedì 26 marzo 2013 09:53
     
      Contiene codice

    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
     
     

    Ciao Ponzano Paolo,

    You wrote on 26/03/2013 :

    Volevo creare un extensionmethod per wrappare la parte di dispatcher e il controllo dell'exception...

    perchè se usi await usi poi la continuation?

    .m



    blog @ //milestone.topics.it
  • 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
     
     

    Ciao Paolo,

    You wrote on 02/04/2013 :

    aspetto che termini la prima esecuzione e poi dico di continuare.... è sbagliato fare cosi?

    async e await servono proprio per evitare le continuation permettendoti di scrivere del codice che in apparenza è procedurale

    Grazie ciao

    .m



    blog @ //milestone.topics.it
  • 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
     
     

    Ciao Paolo,

    You wrote on 03/04/2013 :

    Task[] taskList = new Task[2];
    Task t1 = ....
    Task t2 = ...

    await Task.WhenAll(taskList);

    //prendo i risultati?

    si, a naso direi proprio di si

    .m



    blog @ //milestone.topics.it