Exemple #1
0
        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);
            }
        }
Exemple #2
0
 public static UpdateRoutineState CreateFrom(UpdateRoutineState state, int timestamp)
 {
     return(new UpdateRoutineState(state.Routes)
     {
         Timestamp = timestamp,
         LastUpdate = DateTime.UtcNow
     });
 }
Exemple #3
0
        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));
        }
Exemple #4
0
        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);
                    }
                }
            }));
        }