2016-07-21 20 views
2

Ich habe Befehl wie folgt aus:Multi Threading mit ObservesProperty

CancelCommand = new DelegateCommand(Cancel,() => IsProcessing).ObservesProperty(() => IsProcessing); 

Und in anderen Verfahren nenne ich

Task.Factory.StartNew(() => 
      { 
       IsProcessing = true; // Stop here 
       IsProcessing = false; 
      }); 

Irgendwie die Ausführung stoppt, wenn IsProcessing Satz true. Aber wenn ich zu

Application.Current.Dispatcher.Invoke(() => IsProcessing = true); 
IsProcessing = false; // Hit this line then stop again 
int i = 0; // Never reach here 

ändern Sieht aus wie ObservesProperty Problem verursacht, wenn IsProcessing Satz in nicht UI-Thread. Ist es ein Fehler oder funktioniert es wie geplant?

Antwort

1

Dieses Problem betrifft nicht nur Prism. All Prism verbindet es mit dem INotifyPropertyChanged der von Ihnen angegebenen Eigenschaft und ruft das Ereignis CanExecuteChanged auf.

Das Ereignis ICommand.CanExecuteChanged kann Änderungen an UI-Elementen verursachen (z. B. den Wert der Eigenschaft IsEnabled einer Schaltfläche ändern) - daher muss es von einem UI-Thread aufgerufen werden. Im Gegensatz zur verbindlichen Engine wird dies nicht automatisch ausgeführt.

Sie sollten entweder:

  • die Eigenschaft aus dem UI-Thread Stellen Sie vor/nach dem Thread starten. Mit async/await würde, dass es sehr einfach:

    async Task DoStuff() // start this method from the UI thread 
    { 
        IsProcessing = true; 
        try 
        { 
         await Task.Run(() => { ... }); 
        } 
        finally 
        { 
         IsProcessing = false; 
        } 
    } 
    
  • Verwendung Dispatcher.InvokeAsync. Do nicht Verwenden Sie Invoke - das ist nur ein Thread verschwenden warten auf die Benutzeroberfläche zu vervollständigen.