2

私のViewModelは次のとおりです。

public class SampleViewModel : ViewModelBase
{
 private bool isBusy;
 public bool IsBusy
 {
   get { return isBusy; }
   set { isBusy = value;
         RaisePropertyChanged("IsBusy"); }

 private string prop1;
 public string Prop1
 {
   get { return prop1; }
   set { prop1 = value;
         RaisePropertyChanged("Prop1"); }
 }

 private string prop2;
 public string Prop2
 {
   get { return prop2; }
   set { prop2 = value;
         RaisePropertyChanged("Prop2"); }
 }

 private string prop3;
 public string Prop3
 {
   get { return prop3; }
   set { prop3 = value;
         RaisePropertyChanged("Prop3"); }
 }

 public SampleViewModel()
 {
     new Task(() => LoadProp1Async()).Start();
     new Task(() => LoadProp2Async()).Start(); 
     new Task(() => LoadProp3Async()).Start();
 }

 private void LoadProp1Async()
 {
    Thread.Sleep(5000);
    Prop1 = "a";
 }

 private void LoadProp2Async()
 {
    Thread.Sleep(15000);
    Prop2 = "b";
 }

 private void LoadProp3Async()
 {
    Thread.Sleep(10000);
    Prop3 = "c";
 }
}

意見:

<toolkit:BusyIndicator BusyText="Loading..." IsBusy="{Binding IsBusy}" />

viewmodelプロパティIsBusy==trueのときにスロバーを表示したいと思います。このプロパティは、3つのタスクのいずれかが実行されている場合に当てはまります。

どうすればこれを達成できますか?私は個人的に(メディエーターを使用して)1つの解決策を持っていますが、それは好きではありません。

4

1 に答える 1

4

.NET 4.5を使用している場合は、WhenAllを使用して結合された継続を設定できます。

 public SampleViewModel()
 {
    IsBusy = true;
    var task1 = Task.Run(() => LoadProp1Async());
    var task2 = Task.Run(() => LoadProp2Async());
    var task3 = Task.Run(() => LoadProp3Async());
    Task.WhenAll(task1, task2, task3).ContinueWith(t => IsBusy = false);
 }

そうでない場合は、別のタスク内でWaitAllのようなことを行うことができます。

 public SampleViewModel()
 {
    IsBusy = true;
    new Task(() =>
    {
        var task1 = new Task(() => LoadProp1Async());
        var task2 = new Task(() => LoadProp2Async());
        var task3 = new Task(() => LoadProp3Async());
        task1.Start();
        task2.Start();
        task3.Start();
        Task.WaitAll(task1, task2, task3);
        IsBusy = false;
    }).Start();
 }
于 2013-02-12T05:28:49.510 に答える