none
WPF Multithreading

    Domanda

  • Ho un problema di multithreading con le WPF, più precisamente di accesso ai control da thread secondari.

    In passato ho risolto in questo modo:

    public void MetodoA()
    {
      Thread t = new Thread(new  ThreadStart(MetodoB));    
      t.SetApartmentState(ApartmentState.STA); 
      t.Start();
    }
    
    public void MetodoB()
    {    alert.Dispatcher.Invoke(DispatcherPriority.Background,  (MyDelegate)delegate()
      { alert.Fill = alertColor; });
      //alert è un ellipse
    }

    Ora nella stessa applicazione utilizzo la medesima procedura ma non funziona.Ho provato anche con metodi alternativi ma non c'è stato niente da fare.

    Utilizzando lo stesso metodo utilizzato qui sopra mi dice che non posso accedere all'oggetto perchè appartiene ad unaltro thread.

    L'unica differenza sta nel metodo 'B':

    //ho provato anche questo ma si blocca, più precisamente in fase di debug se avanzo step-by-step, arrivato qui si perde e non mi permette più di avanzare
    /*                 carica.Dispatcher.Invoke(DispatcherPriority.Background, (MyDelegate)delegate()
    { carica.Fill = new SolidColorBrush(Colors.AliceBlue); });
    */ 
    
    //quando l'esecuzione arriva all'IF scatta l'eccezione 
    if (carica.IsEnabled)
    {
    //.....qui accedo a diversi controllo e se anche funzionasse il metodo "Control.Dispatcher.Invoke(....){.....});" preferirei evitarlo perchè avrei una montagna di codice in più da scrivere
    }

    Ho provato anche con un semplicissimo BackgroundWorker ma mi dà la stessa eccezione.

    Inoltre ho provato in questo modo:

    this.Dispatcher.BeginInvoke(new MetodoB_Async(MetodoB));

    ma in questo modo non entra mai in "MetodoB".

    giovedì 23 febbraio 2012 15:21

Tutte le risposte