JS для await... эквивалента в C#
Моя цель — воссоздать небольшой игровой автомат, написанный на JavaScript, на C#. Я делаю это, чтобы изучить С#. Я нашел проект на Github (пользователь: asiryk, репозиторий: slot-game).
Кроме файла ReelsContainer.ts я уже успел перевести проект. Этот файл в настоящее время оказывается моей главной проблемой. Конкретно речь идет об этих двух функциях, для которых я не знаю, как получить тот же результат на C#:
async spin() {
// Overall time of spinning = shiftingDelay * this.reels.length
//
const shiftingDelay = 500;
const start = Date.now();
const reelsToSpin = [...this.reels];
for await (let value of this.infiniteSpinning(reelsToSpin)) {
const shiftingWaitTime = (this.reels.length - reelsToSpin.length + 1) * shiftingDelay;
if (Date.now() >= start + shiftingWaitTime) {
reelsToSpin.shift();
}
if (!reelsToSpin.length) break;
}
// reel.sprites[2] - Middle visible symbol of the reel
//
return this.checkForWin(this.reels.map(reel => reel.sprites[2]));
}
private async* infiniteSpinning(reelsToSpin: Array<Reel>) {
while (true) {
const spinningPromises = reelsToSpin.map(reel => reel.spinOneTime());
await Promise.all(spinningPromises);
this.blessRNG();
yield;
}
}
До сих пор я пробовал следующую структуру:
public async Task<bool> Spin()
{
const int shiftingDelay = 500;
DateTime start = DateTime.Now;
List<Reel> reelsToSpin = new List<Reel>(reels);
/* INCOMPLETE infiniteSpinning */
return this.CheckForWin(this.reels.Select(reel => reel.sprites[2]));
}
private async Task infiniteSpinning(List<Reel> reelsToSpin)
{
var spinningPromises = reelsToSpin.Select(reel => reel.SpinOneTime());
await Task.WhenAll(spinningPromises);
this.BlessRNG();
}
Но теперь я застрял и не могу двигаться дальше, потому что не знаю, как реализовать for await...of и метод private async* в C#.
Как реализовать методы Spin() и InfiniteSpinning() в C#?
[Изменить] Следующая информация о моей среде разработки:Visual Studio 2013 (C# 5.0), .NET Framework 4.8, WPF
1 ответ
Я думаю, ты послеawait foreach
.
Из итерации с асинхронными перечислениями в С# 8:
await foreach (int item in RangeAsync(10, 3)) Console.Write(item + " "); // Prints 10 11 12
с
static async IAsyncEnumerable<int> RangeAsync(int start, int count) { for (int i = 0; i < count; i++) { await Task.Delay(i); yield return start + i; } }