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;
 }
}
Другие вопросы по тегам