0

我有一个具有事件处理程序的函数。它正在读取 gps 位置,并且每次读取位置时我将数据放入数据库中,问题是我在一秒钟内有 3 个输入。

例如,如何使某些部分代码每 5 秒执行一次?

我曾尝试做 timer_tick,但我不知道该怎么做,因为这是带有事件处理程序的函数。

这是我的功能:

private void GPS_PositionReceived(string Lat, string Lon)
{
    arrLon = Lon.Split(new char[] { '°', '"' }, StringSplitOptions.RemoveEmptyEntries);
    dblLon = double.Parse(arrLon[0]) + double.Parse(arrLon[1], new System.Globalization.NumberFormatInfo()) / 60;
    deciLon = arrLon[2] == "E" ? dblLon : -dblLon;
    arrLat = Lat.Split(new char[] { '°', '"' }, StringSplitOptions.RemoveEmptyEntries);
    dblLat = double.Parse(arrLat[0]) + double.Parse(arrLat[1], new System.Globalization.NumberFormatInfo()) / 60;
    deciLat = arrLat[2] == "N" ? dblLat : -dblLat;

                ...  //code
}

我希望这部分代码每 5 秒使用一次。

哦,是的,这是事件处理程序:

GPS.PositionReceived += new NmeaInterpreter.PositionReceivedEventHandler(GPS_PositionReceived);
4

3 回答 3

2

我想你想说的是你的方法每秒被调用 3 次,而实际上你只希望它每 5 秒被调用一次?正确的。

如果是这样,存储一个

DateTime lastDBUpdate

变量,每次写入数据库时​​,更新此时间戳。

然后你可以使用像

if(DateTime.Now.Subtract(lastDBUpdate).TotalSeconds < 5) { return; }

作为您方法的第一行。

// Timestamp of last update time
// Default to very old timestamp on init so it always runs once straight away
private DateTime lastDBUpdate = DateTime.MinValue;

private void GPS_PositionReceived(string Lat, string Lon)
{
    // Throttle this method
    if(DateTime.Now.Subtract(lastDBUpdate).TotalSeconds < 5) return;

    // your existing code

    // Update the timestamp 
    lastDBUpdate = DateTime.Now;
}
于 2012-05-17T11:07:58.883 回答
1

只需使用计时器,检查这个

于 2012-05-17T11:07:07.153 回答
1

您总是可以有一个静态/类级别的变量来指示上次保持 GPS 位置的时间。

Public DateTime LastGPSInsert {get; set;}

...

if((DateTime.Now - LastGPSInsert).TotalSeconds > 5)
{
    //Do Insert
    LastGPSInsert = DateTime.Now;
}
//Skip insert
于 2012-05-17T11:08:16.637 回答