private async Task Run(UpdateTrigger trigger, CancellationToken cancel) { updateTrigger = trigger; trigger.StatusChanged += OnTriggerStatus; try { while (!cancel.IsCancellationRequested) { await trigger.NextTrigger(cancel); Update(); } } catch (TaskCanceledException) { } catch (Exception) { } finally { trigger.StatusChanged -= OnTriggerStatus; } void OnTriggerStatus(object sender, TriggerEventArgs e) { TriggerChanged?.Invoke(this, e); } }
public Task StartAsync(TimeSpan updateInterval) { if (sim == null) { cancelSource = new CancellationTokenSource(); var trigger = new UpdateTrigger(Game.Players.Count, 2, updateInterval, 6 * updateInterval); sim = Task.Run(() => Run(trigger, cancelSource.Token)); } return(Task.CompletedTask); }