2017-02-08 10 views
1

WPFとCaliburn.Microでアプリケーションを構築しています。私はUIを更新するために、UIスレッドと同期する必要があることを知っている他のプログラミング言語からタスクのViewModelプロパティを更新する

public class DemoViewModel : PropertyChangedBase 
{ 
    private int m_Progress; 

    public int Progress 
    { 
     get { return m_Progress; } 
     set 
     { 
      if (value == m_Progress) return; 
      m_Progress = value; 

      NotifyOfPropertyChange(); 
      NotifyOfPropertyChange(nameof(CanStart)); 
     } 
    } 

    public bool CanStart => Progress == 0 || Progress == 100; 

    public void Start() 
    { 
     Task.Factory.StartNew(example); 
    } 

    private void example() 
    { 
     for (int i = 0; i < 100; i++) 
     { 
      Progress = i + 1; // this triggers PropertChanged-Event and leads to the update of the UI 
      Thread.Sleep(20); 
     } 
    } 
} 

:私は、タスク/スレッドと私は私が正しくUIを更新するために必要なものを疑問に思ってからプログレスバーを更新したいです私のコードはうまくいきます。私が見逃したことや散発的なエラーを引き起こす可能性のあるものはありますか、同期の面倒を隠す魔法がありますか?

+0

INPCイベントは自動的にUIスレッドにマーシャリングされるため、心配する必要はありません。しかし、...あなたは実際に更新するにはあまりにも忙しいので、あなたは20の血まみれのミリ秒(Thread.Sleep(20)!!!!!!!)ごとにUIを更新すればUIのジャックは表示されません。 – Will

答えて

2

INotifyPropertyChangedの実装方法によって異なります。実装は、すべてのUI更新を適切なディスパッチャに委譲する必要があります。

サンプル実装:

public void RaisePropertyChanged([CallerMemberName]string name) { 
     Application.Current.Dispatcher.Invoke(() => { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 
     }, System.Windows.Threading.DispatcherPriority.Background); 
    } 

またビットを開始したタスクをクリーンアップする:

編集: 削除不要なブール値の戻り値、およびタスクが完了したときにUIスレッドをオフに滞在するConfigureAwaitを設定。

public async void Start() 
{ 
    await Task.Run(() => example()).ConfigureAwait(false); 
} 

private async Task example() 
{ 
    for (int i = 0; i < 100; i++) 
    { 
     Progress = i + 1; // this triggers PropertChanged-Event and leads to the update of the UI 
     await Task.Delay(20); 
    } 
} 
+0

ありがとうございます。私はCaliburn.Microのソースコードをチェックし、PropertyChangedBaseからViewModelを派生させると、Caliburn.Microによって同期が行われます。私も学んだ同期のためにCMに便利なExecuteヘルパークラスがあります。 –

+1

@Ranga知っておいて、CMはとても便利なフレームワークです。 – JSteward

+0

このコンテキストでawait/asyncを使用する利点は何ですか?メソッドの例()には戻り値はありませんが、Task Iにとっては値が必要です。 –

関連する問題