-1

別のスレッドで実行するメソッドを呼び出す DispatcherTimer を使用しています。非効率性について本当に心配する必要のない単純なプログラムを実行しています。DispatcherTimer スレッドが UI を変更できるようにしながら、UI スレッドが DispatcherTimer の終了を待機するようにするにはどうすればよいですか?

*私はこれが半分繰り返されるかもしれないことを理解していますが、私が見た例はケース固有のものです. ありがとう

private void spinButton_Click(object sender, RoutedEventArgs e)
    {

        minSelTextBlock.Text = "";

            Index = 0;
            maxIndex = rnd.Next(40, 60);
            DispatcherTimer timer;
            timer = new DispatcherTimer(DispatcherPriority.Normal);
            timer.Interval = TimeSpan.FromMilliseconds(60);
            timer.Tick += new EventHandler(TimerTick);
            timer.Start();
            selPeople[x].IsCheck = false;
            displayCount++;

            Index = 0;
            maxIndex = rnd.Next(40, 60);
            timer = new DispatcherTimer(DispatcherPriority.Normal);
            timer.Interval = TimeSpan.FromMilliseconds(60);
            timer.Tick += new EventHandler(TimerTick);
            timer.Start();
            selPeople[x].IsCheck = false;
            displayCount++;

            displayImage2b.Source = new BitmapImage(new Uri(selPeople[0].ImgPath));          
    }

 private void TimerTick(object sender, EventArgs e)
    {
        minSelTextBlock.Text = "";

        x = rnd.Next(0, selPeople.Count);
        while (x == temp)
        {
            x = rnd.Next(0, selPeople.Count);
        }

        if (displayCount == 0)
            displayImage1a.Source = new BitmapImage(new Uri(selPeople[x].ImgPath));
        if (displayCount == 1)
            displayImage2a.Source = new BitmapImage(new Uri(selPeople[x].ImgPath));


        if (++Index >= maxIndex)
        {
            ((DispatcherTimer)sender).Stop();
        }
        Index++;
        temp = x;
    }

基本的に、selPeople[x].IsCheck = false の前に最終的な x 値を取得するには TimerTick が必要です。これは、リストから選択されたばかりの項目を削除することがポイントであるためです。

4

1 に答える 1

0

呼び出し元のメソッドが呼び出されたメソッドの結果を待機するようにする場合は、.Net 4.5 で利用可能な Async/Await を使用できます。

次のようなことができます。

private async void spin()
    {

        minSelTextBlock.Text = "";

            Index = 0;
            maxIndex = rnd.Next(40, 60);
            DispatcherTimer timer;
            timer = new DispatcherTimer(DispatcherPriority.Normal);
            timer.Interval = TimeSpan.FromMilliseconds(60);
            timer.Tick += new EventHandler(StartTicker);
            timer.Start();
            selPeople[x].IsCheck = false;
            displayCount++;

            Index = 0;
            maxIndex = rnd.Next(40, 60);

            await Ticker();

            selPeople[x].IsCheck = false;
            displayCount++;

            displayImage2b.Source = new BitmapImage(new Uri(selPeople[0].ImgPath));          
    }


  Private Task<void> StartTicker()
  {
    Task.Run<void>(()=>Ticker());
  }

private void Ticker()
    {
      while(your condition is true)
      {
        minSelTextBlock.Text = "";

        x = rnd.Next(0, selPeople.Count);
        while (x == temp)
        {
            x = rnd.Next(0, selPeople.Count);
        }

        if (displayCount == 0)
            displayImage1a.Source = new BitmapImage(new Uri(selPeople[x].ImgPath));
        if (displayCount == 1)
            displayImage2a.Source = new BitmapImage(new Uri(selPeople[x].ImgPath));


        if (++Index >= maxIndex)
        {
            break;
        }
        Index++;
        temp = x;
         Thread.Sleep(60); 
      }
    }

タイマーの代わりに、タイマーと同じWhile Loopandを使用しました。Thread.Sleep()

async/await について学びたい場合は、これをお勧めします

ところで、私はこのコードをコンパイルしていません。そのため、構文またはその他のエラーが含まれている可能性があります。

于 2013-07-19T18:57:30.013 に答える