C# async вывод последовательности чисел

Как мне написать свой асинхронный метод, который, например, выводит на экран последовательность чисел? (Предполагается, что Console.WriteLine будет блокировать этот поток, он же все равно работает быстро). То есть я хочу, например, создать 2 таски, которые будут по очереди выводить по числу в консоль. При помощи генераторов я представляю, как решить эту задачу, а как при помощи асинхронного кода?


Ответы (1 шт):

Автор решения: Scrzii

Я нашел решение, которое мне было нужно. Инструкция await внутри асинхронного метода заставляет выходить обратно в планировщик, пока действие не закончено. Мне был интересен метод, который заставляет выходить в планировщик безусловно, им оказался Task.Yield(). В итоге решение этой задачи выглядит примерно так:

static async Task Out(int n, int x)
{
    for (int i = 0; i < n; i++)
    {
        Console.WriteLine(x);
        await Task.Yield();
    }
}

static async Task MyOut()
{
    var t1 = Out(10, 1);
    var t2 = Out(10, 2);
    var tasks = new List<Task> { t1, t2 };
    while (tasks.Count > 0)
    {
        var ready = await Task.WhenAny(tasks);
        tasks.Remove(ready);
    }
}

static void Main(string[] args)
{
    Console.WriteLine("Started");
    var task = MyOut();
    task.Wait();
    Console.WriteLine("Finished");
}

В результате вывод будет примерно такой:
Started
1
2
1
2
1
2
2
2
2
2
2
2
2
1
1
1
1
1
1
1
Finished
Вызов методов происходит не прямо друг за другом, я предполагаю, что есть какое-то минимальное ограничение в тиках на выполнение кусочка асинхронной задачи, но могу ошибаться. Поправьте меня, если я неправ.

→ Ссылка