Установка продолжительности функции таймера UWP C#

У меня есть приложение, которое перемещает машину по указанным местам на карте. Я использую приведенный ниже код для достижения этой функциональности. Но теперь я хочу установить продолжительность для этого. Я имею в виду, что машина должна добраться в определенное время от начала до конца. Как мне это сделать. Я передаю продолжительность таймеру, как показано в коде.

  public class PathAnimation
{
    private const int _delay = 30;
    private DispatcherTimer _timerId;
    private int? _duration;
    private int _frameIdx = 0;
    private bool _isPaused;
    private DateTime _timerStart = DateTime.Now;

    public  PathAnimation(IntervalCallback intervalCallback,int? duration)
    {
        _duration = duration;
        _timerId = new DispatcherTimer();
        _timerId.Interval = new TimeSpan(0, 0, 0, 0, _delay);
        _timerId.Tick += (s, a) =>
        {
            if (!_isPaused)
            {
                if (intervalCallback != null)
                {
                    intervalCallback(AppGlobals._intervalLocs[_frameIdx], AppGlobals._intervalIdx[_frameIdx], _frameIdx);
                }
                 if ((DateTime.Now - _timerStart).TotalMilliseconds >= _duration.Value)
                {
                    _timerId.Stop();
                }
                _frameIdx++;

            }
        };
    }
    public delegate void IntervalCallback(BasicGeoposition loc, int pathIdx, int frameIdx);
    public void Play()
    {  _timerStart = DateTime.Now;
        _frameIdx = 0;
        _isPaused = false;
        _timerId.Start();
    }
    public void Pause()
    {
        _isPaused = true;
    }

    public void Stop()
    {
        if (_timerId.IsEnabled)
        {
            _frameIdx = 0;
            _isPaused = false;
            _timerId.Stop();
        }
    }
}

Но теперь происходит то, что машина достигает скорости быстрее, чем время продолжительности, и вызывает ошибку вне индекса на intervalCallback(AppGlobals._intervalLocs[_frameIdx], AppGlobals._intervalIdx[_frameIdx], _frameIdx);


person nsds    schedule 07.08.2018    source источник
comment
Не могли бы вы добавить, в чем ваша проблема. В коде, который вы нам показали, вы уже устанавливаете интервал. Если вам нужно максимальное время, вы можете ввести счетчик, который подсчитывает тики и умножает его на время вашего интервала.   -  person TheTanic    schedule 07.08.2018
comment
Я говорю о продолжительности. В моем коде я использую интервал 30 миллисекунд для вызова таймера. Но мой вопрос в том, как я могу остановить таймер в течение времени, которое я передал функции PathAnimation   -  person nsds    schedule 07.08.2018
comment
Либо вы делаете другой таймер, который имеет интервал вашей продолжительности, либо вы проверяете свою тик-функцию, если продолжительность превышена   -  person TheTanic    schedule 07.08.2018
comment
как проверить это в Tick-Function, если продолжительность превышена?   -  person nsds    schedule 07.08.2018


Ответы (1)


Но теперь происходит то, что машина достигает быстрее, чем время продолжительности, и вызывает ошибку вне индекса ...

Я не уверен в вашей логике здесь, но чтобы избежать получения IndexOutOfRangeException, вы должны убедиться, что Count коллекции всегда больше, чем значение, которое вы передаете индексатору, например:

_timerId.Tick += (s, a) =>
{
    if (!_isPaused)
    {
        if (intervalCallback != null 
            && AppGlobals._intervalLocs.Count > _frameIdx
            && AppGlobals._intervalIdx.Count > _frameIdx)
        {
            intervalCallback(AppGlobals._intervalLocs[_frameIdx], AppGlobals._intervalIdx[_frameIdx], _frameIdx);
        }

        _frameIdx++;

        if ((DateTime.Now - _timerStart).TotalMilliseconds >= _duration.Value)
            _timerId.Stop();
    }
};
person mm8    schedule 07.08.2018
comment
С этим условием он не рухнет. Но не смог достичь цели. Например: если массив _intervalLocs содержит 5 местоположений. и продолжительность установлена ​​​​как 2 минуты. Эти 5 локаций должны пройти ровно за 2 минуты. Теперь он охватывает менее 2 минут - person nsds; 08.08.2018
comment
Вы посещаете место раз в _delay, не так ли? Так работает таймер... - person mm8; 08.08.2018
comment
Вам нужно знать количество элементов в массиве и соответственно установить интервал таймера. Вы хотите, чтобы таймер тикал один раз для каждого элемента в массиве или что? - person mm8; 08.08.2018
comment
моя цель - переместить автомобиль на карте из начального местоположения в конечное за определенное время. Для этого AppGlobals._intervalLocs содержит все местоположения, а переменная продолжительности содержит время - person nsds; 08.08.2018
comment
Итак, установите интервал таймера на (double)duration.Value / _interValLocs.Count? - person mm8; 08.08.2018