2017-12-29 40 views
1

forループは、タイマーが終了するまで待ってから、その後forループを続行します。どのように私はこれを行う必要がありますか?私は&非同期を待ってみました、私は何か間違っています。 今の動作:ループが開始され、タイマーが実行されますが、終了するまで待機しません。それで、それはループし、再びタイマーを起動します。DispatcherTimerが終了するまでforループを一時停止する方法はありますか?

私のプロジェクト以上:電動式ベッドのモーターテスターです。このコードは、モーターが上下に動いている間に実行する必要があります。 私はMVVM、WPF、ADRUINO UNOを使用しています。

誰かが良い提案をしているなら、私は聞いてみたいと思います。 (私の悪い英語を残して申し訳ありません) CODE OF

PIECE:

あなたMVCEよりコード、一見DispatcherTimerの唯一の目的は、導入することであるとよりがない限り:

private async void Loop(object sender, EventArgs e) 
    { 
     for (int i = 0; i < DOORLOOPTEST.Properties.Settings.Default.LOOPS; i++) 
     { 
      string value = DOORLOOPTEST.Properties.Settings.Default.UP_or_DOWN; 
      switch (value) 
      { 
       case "UP": 
        _time = TimeSpan.FromSeconds(HeadUpTime); 
        _MotorMove = new Task(() => MotorMove(sender, e, _time)); 
        await _MotorMove; 
        break; 

       case "DOWN": 
        _time = TimeSpan.FromSeconds(HeadDownTime); 
        _MotorMove = new Task(() => MotorMove(sender, e, _time)); 
        await _MotorMove; 
        break; 
      } 
     } 
    } 

    private void MotorMove(object sender, EventArgs e, TimeSpan _time) 
    { 
     TimerBegins(sender, e); 
     LOOP_timer = new DispatcherTimer(new TimeSpan(0, 0, 1), DispatcherPriority.Normal, delegate 
     { 
      if (_time == TimeSpan.Zero) 
      { 
       LOOP_timer.Stop(); 
       LOOP_timer.Tick += TimerIsGedaan; 
      } 
      _time = _time.Add(TimeSpan.FromSeconds(-1)); 
     }, Application.Current.Dispatcher); 

     LOOP_timer.Start(); 
    } 
+1

あなたLoopコードからTask.Run、 '_time'タイムスパンの遅延を遅延させますか?その場合は、単に 'MotorMove'を非同期にし、' DispatcherTimer'を 'Task.Delay(_time)'を待つものに置き換えることができますか?または私は何かを逃している?また、 'TimerIsGedaan'はタイマーが止まったら購読しているようです - これは期待していますか? – StuartLC

答えて

0

だけのコメントを明確にします遅延がTimeSpan _timeで、1秒のクォンタでオフになり、最後のティックがタイマーを停止し、TimerIsGedaanをサブスクライブし、タイマーを再び開始します。あなたがしたいすべてがTimeSpan _time一度TimerIsGedaanがどのように非同期しMotorMoveを変換し、そしてあなたがするたびに新しいスレッドを必要としない限り、あなたはまた、削除することを検討できTask.Delay

private async Task MotorMove(object sender, EventArgs e, TimeSpan _time) 
{ 
    TimerBegins(sender, e); 
    await Task.Delay(_time); 
    TimerIsGedaan(); 
} 

の使用方法については、経過した呼び出しであると仮定すると

あなたが `TimerBegins`と` TimerIsGedaan`のためのコードを提供していないが、一見したいすべてが非UIブロック、すなわち

await MotorMove(sender, e, _time); 
+1

スチュアート、これは私が望んでいたように働いていた、THNK U! – B5891

関連する問題