Как мне написать свой асинхронный метод, который, например, выводит на экран последовательность чисел? (Предполагается, что Console.WriteLine будет блокировать этот поток, он же все равно работает быстро). То есть я хочу, например, создать 2 таски, которые будут по очереди выводить по числу в консоль. При помощи генераторов я представляю, как решить эту задачу, а как при помощи асинхронного кода?
1 Answers
Я нашел решение, которое мне было нужно. Инструкция 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
Вызов методов происходит не прямо друг за другом, я предполагаю, что есть какое-то минимальное ограничение в тиках на выполнение кусочка асинхронной задачи, но могу ошибаться. Поправьте меня, если я неправ.
- 186
- 8
System.Collections.Concurrent.BlockingCollectionиSystem.Threading.Channels.Channel. Ну и всякие трюки с многопоточкой типа этого. – aepot Nov 26 '21 at 18:28async/awaitи придумали. Для того чтобы пошло дело, надо понять - зачем придумали. Вот тогда станет ясно, какие задачи с помощью этого подхода надо решать. Заворачивать в поток синхронную операцию много ума не требуется. Асинхронное программирование. Вот еще пример. – aepot Nov 26 '21 at 23:13