protected async Task RunPromptingLoop() { while (!StopToken.IsCancellationRequested) { var timeGap = TimeSpan.FromMilliseconds(Res.GetRandomCoefficient(GapMean, GapSigma)); //await Task.Delay(timeGap); if (StopToken.IsCancellationRequested) { break; // Just so that a "stop" doesn't mean "do one last cue" it means stop right away. } // TODO: Later on, this won't just be a plain random draw. var offenseKey = MeleeBetaActivity.OFFENSE; var defenseKey = MeleeBetaActivity.DEFENSE; var offendersMoveIndex = StaticRandom.Next(4); var defendersMoveIndex = AppropriateParries[offendersMoveIndex]; var goTime = DateTime.Now + timeGap; ExchangeOfBlows exchange; if (Res.CoinFlip) { exchange = new ExchangeOfBlows() { CueTime = goTime, ExchangeID = Guid.NewGuid(), MyClassifierKey = offenseKey, MyGestureIndex = offendersMoveIndex, OppClassifierKey = defenseKey, OppGestureIndex = defendersMoveIndex }; } else { exchange = new ExchangeOfBlows() { CueTime = goTime, ExchangeID = Guid.NewGuid(), MyClassifierKey = defenseKey, MyGestureIndex = defendersMoveIndex, OppClassifierKey = offenseKey, OppGestureIndex = offendersMoveIndex }; } // Now actually send out the event. OnExchangeChosen.Raise(exchange); await Task.WhenAny(readyToProceed.WaitAsync(), StopToken.AsTask()).Result; } }