private void UpdateInLoop( IBus13RouteDataService dataService, IEnumerable <Route> routes, TimeSpan sleepInterval, CancellationToken token) { _updateRoutineState = new UpdateRoutineState(routes); while (!token.IsCancellationRequested) { var nextSleepInterval = sleepInterval; lock (_lockObject) { var now = DateTime.UtcNow; try { if ((now - _updateRoutineState.LastUpdate) >= sleepInterval) { _updateRoutineState = this.RunUpdateVehicleLocationsRoutine(dataService, _updateRoutineState); } else { nextSleepInterval = sleepInterval - (now - _updateRoutineState.LastUpdate) + TimeSpan.FromSeconds(1); } } catch (Exception e) { this.RaiseVehicleLocationsUpdateFailedEvent(); Insights.Report(e, Xamarin.Insights.Severity.Warning); } } Task.Delay(nextSleepInterval).Wait(token); } }
public static UpdateRoutineState CreateFrom(UpdateRoutineState state, int timestamp) { return(new UpdateRoutineState(state.Routes) { Timestamp = timestamp, LastUpdate = DateTime.UtcNow }); }
private UpdateRoutineState RunUpdateVehicleLocationsRoutine( IBus13RouteDataService dataService, UpdateRoutineState state) { this.RaiseVehicleLocationsUpdateStartedEvent(); var response = dataService.GetVehicleLocationsAsync( state.Routes, GeoRect.EarthWide, state.Timestamp) .ConfigureAwait(false) .GetAwaiter() .GetResult(); var vehicleLocationUpdates = this.UpdateVehicleLocations(response.Updates); this.RaiseVehicleLocationsUpdatedEvent(vehicleLocationUpdates); return(UpdateRoutineState.CreateFrom(state, response.Timestamp)); }
public Task UpdateVehicleLocationsAsync() { if (_updateRoutineState == null) { return(Task.FromResult <object>(null)); } return(Task.Factory.StartNew(() => { lock (_lockObject) { try { _updateRoutineState = this.RunUpdateVehicleLocationsRoutine(_dataService, _updateRoutineState); } catch (Exception e) { this.RaiseVehicleLocationsUpdateFailedEvent(); Insights.Report(e); } } })); }