Есть много способов сделать это, это только некоторые примеры.
Предполагается, что вы хотите запустить группу задач и pipe их в метод с именем handle (асинхронный или нет), чтобы они работали асинхронно и не ожидалидля всего остального, чтобы закончить.
Примечание оба решения ждут завершения, вы можете сделать это или нет
private static async Task<string> DoAsyncTask(string name)
{
Console.WriteLine($"Do {name}");
// simulate a delay
await Task.Delay(5000);
return name;
}
private static async Task HandleAsync(Task<string> task)
{
var name = await task;
Console.WriteLine($"Done {name}");
}
public static async Task Main()
{
// List of names
var nameArray = new[] { "task 1", "task 2", "task 3", "task 4", "task 5", "task 6", "task 7", };
Console.WriteLine("Started " + DateTime.Now);
// pump the names in to do async, then the resulting tasks in toHandleAsync
var taskList = nameArray.Select(DoAsyncTask)
.Select(HandleAsync);
// wait for all tasks
await Task.WhenAll(taskList);
Console.WriteLine("Finished " + DateTime.Now);
Console.ReadKey();
}
Вывод
Started 1/10/2019 12:08:03 PM
Do task 1
Do task 2
Do task 3
Do task 4
Do task 5
Do task 6
Do task 7
Done task 5
Done task 7
Done task 6
Done task 4
Done task 2
Done task 1
Done task 3
Finished 1/10/2019 12:08:08 PM
Решение потока данных вам потребуется System.Threading.Tasks.Dataflow nuget
private static async Task<(string, DateTime)> DoAsyncTask(string name)
{
Console.WriteLine($"Do {name}");
// simulate a delay
await Task.Delay(5000);
return (name, DateTime.Now);
}
private static void Handle((string, DateTime) someTuple)
{
Console.WriteLine($"Name {someTuple.Item1}, value {someTuple.Item2}");
}
public static async Task Main()
{
// List of names
var nameArray = new[] { "task 1", "task 2", "task 3", "task 4", "task 5", "task 6", "task 7", };
var options = new ExecutionDataflowBlockOptions()
{
EnsureOrdered = false,
MaxDegreeOfParallelism = 50
};
var transform = new TransformBlock<string, (string, DateTime)>(DoAsyncTask, options);
var actionBlock = new ActionBlock<(string, DateTime)>(Handle, options);
transform.LinkTo(actionBlock, new DataflowLinkOptions(){PropagateCompletion = true});
Console.WriteLine("Started " + DateTime.Now);
foreach (var name in nameArray)
{
transform.Post(name);
}
transform.Complete();
await actionBlock.Completion;
Console.WriteLine("Finished " + DateTime.Now);
Console.ReadKey();
}
Вывод
Started 1/10/2019 12:21:17 PM
Do task 2
Do task 1
Do task 4
Do task 3
Do task 5
Do task 6
Do task 7
Name task 2, value 1/10/2019 12:21:22 PM
Name task 5, value 1/10/2019 12:21:22 PM
Name task 7, value 1/10/2019 12:21:22 PM
Name task 3, value 1/10/2019 12:21:22 PM
Name task 6, value 1/10/2019 12:21:22 PM
Name task 4, value 1/10/2019 12:21:22 PM
Name task 1, value 1/10/2019 12:21:22 PM
Finished 1/10/2019 12:21:22 PM
Обратите внимание, что вы можете сделать это и с RX