GMap.NET WPF标记计时器更新

时间:2018-07-11 03:14:15

标签: wpf multithreading gmap.net

我几乎没有使用线程的经验,因此我可能在逻辑中缺少一些非常基本的信息。

无论如何,我正在尝试基于1000ms计时器更新GMapMarker。

我的计时器开始:

aTimer = new System.Timers.Timer();
aTimer.Elapsed += OnTimerEvent;
aTimer.Interval = 1000;
aTimer.Enabled = true;

我的更新代码:

int _positionIncriment = 0;
private  void OnTimerEvent(object sender, System.Timers.ElapsedEventArgs e)
{
    PointLatLng p = m_debugPath[_positionIncriment];
    _gpsMarker.Position = p;
    _positionIncriment++;

    _gmap.ForceUpdateOverlays();

    if(_positionIncriment >= m_debugPath.Count)
    {
        _positionIncriment = 0;
    }
}

当我逐步执行此块时,它在ForceUpdateOverlays处停止,并且不再进行下去。 据我所知,GMap的渲染功能位于其自身的线程内,这可能会引起问题..但是正如我所说,对线程的基本了解让我有些迷失。 任何帮助都会很棒。

2 个答案:

答案 0 :(得分:1)

使用DispatcherTimer而不是Timer。其Tick事件在UI线程中触发:

using System.Windows.Threading;
...

aTimer = new DispatcherTimer();
aTimer.Tick += OnTimerEvent;
aTimer.Interval = TimeSpan.FromSeconds(1);
aTimer.IsEnabled = true; // or aTimer.Start();
...

private void OnTimerEvent(object sender, EventArgs e)
{
    ...
}

答案 1 :(得分:0)

看起来我需要在运行代码之前调用Dispatcher。 我不知道这是解决此问题的“正确”方法,但最终结果是我想要的。

希望这对其他人有帮助。

int _positionIncrement = 0;
private  void OnTimerEvent(object sender, System.Timers.ElapsedEventArgs e)
{
    this.Dispatcher.Invoke(() =>
    {
        PointLatLng p = m_debugPath[_positionIncrement];
        _gps.Position = p;
        _positionIncrement++;

        _gmap.ForceUpdateOverlays();

        if(_positionIncrement >= m_debugPath.Count)
        {
            _positionIncrement = 0;
        }
    });
}