- Задачи добавляются (одновременно) в коллекцию
- Коллекция предоставляет IAsyncEnumerable, который возвращает завершенные задачи (в порядке выполнения также можно использовать одновременно)
var collection = new MyCollection();
var p1 = Task.Run(() =>
{
collection.Add(Task.Run(async () =>
{
await Task.Delay(3000);
return "Producer1-1";
}));
collection.Add(Task.Run(async () =>
{
await Task.Delay(2000);
return "Producer1-2";
}));
});
var p2 = Task.Run(() =>
{
collection.Add(Task.Run(async () =>
{
await Task.Delay(1000);
return "Producer2-1";
}));
});
Task.WhenAll(p1, p2).ContinueWith(_ => collection.CompleteAdding());
string[] expectedOrder = ["Producer2-1", "Producer1-2", "Producer1-1"];
var actualOrder = await collection.GetConsumingEnumerable().ToListAsync();
Assert.Equal(expectedOrder, actualOrder);
Подробнее здесь: https://stackoverflow.com/questions/789 ... eted-tasks