2011-11-03 7 views
5

Ho un progetto wpf in cui sto usando INotifyPropertyChanged su una proprietà che si lega alla casella di testo. Sto aggiornando questo valore su un thread diverso usando task (TaskParallelLibrary). È aggiornato correttamente e NON genera un'eccezione. Stavo pensando che genererebbe un'eccezione perché è in esecuzione su un thread in background e non su un thread UI. Ovviamente lancia un'eccezione se utilizzo direttamente l'elemento dell'interfaccia utente. Quindi, il meccanismo di binding di INotifyPropertyChanged si occupa di inviare automaticamente il thread dell'interfaccia utente?Libreria parallela attività INotifyPropertyChanged NON genera un'eccezione?

Ecco il mio codice con la proprietà.

private string _textProperty = ""; 
    public string TextProperty 
    { 
     get 
     { 
      return _textProperty; 
     } 
     set 
     { 
      if (_textProperty != value) 
      { 
       _textProperty = value; 
       NotifyPropertyChanged("TextProperty"); 
      } 
     } 
    } 

e il mio compito è quello di creazione

var task = new Task(() => 
     { 
      TextProperty = "ABCD"; // Works. 
      // txtBox.Text = "ABCD"; // Throws an exception. 
     }); 
     task.Start(); 

e la casella di testo in XAML è <TextBox Name="txtBox" Text="{Binding TextProperty}"/>

risposta

6

Stavo pensando che genererebbe un'eccezione perché è in esecuzione su un thread in background e non sul thread dell'interfaccia utente.

WPF consente di impostare un valore associato su un thread in background. Gestirà il marshalling sul thread dell'interfaccia utente.

Tenere presente, tuttavia, che questo non funziona non per elementi di una raccolta. Se si desidera aggiungere a uno associato, ad esempio, sarà necessario eseguire il marshalling sul thread dell'interfaccia utente. Ci sono various workarounds, tuttavia, che può facilitare questo se necessario. Si noti che this behavior changes in WPF 4.5, che semplificherà lo sviluppo multithread in WPF in futuro.

+1

+1. Link interessante a WPF 4.5. Sembra che abbiano risolto alcune delle cose che non mi piacciono attualmente su WPF. – RichardOD

+0

@Reed hai a portata di mano un riferimento per come wpf effettua il marshalling dell'aggiornamento per te? –

1

Binding alle singole proprietà non è thread affine. Puoi farlo senza problemi, il binding farà il necessario per te.
Tuttavia, fare attenzione, questo è solo per le associazioni di proprietà singola. Se si dispone ad esempio di ObservableCollection, non è possibile aggiungere o rimuovere elementi da un altro thread, anche se la raccolta è vincolata tramite il binding!