2023-09-21 18:58:32 +02:00
|
|
|
|
using System.Threading.Tasks.Dataflow;
|
|
|
|
|
|
|
2023-09-22 22:16:56 +02:00
|
|
|
|
namespace Insight.Server.Extensions;
|
|
|
|
|
|
|
|
|
|
|
|
public static class Async
|
2023-09-21 18:58:32 +02:00
|
|
|
|
{
|
2023-09-22 22:16:56 +02:00
|
|
|
|
public static async Task ParallelForEach<T>(
|
|
|
|
|
|
this IAsyncEnumerable<T> source,
|
|
|
|
|
|
Func<T, Task> body,
|
|
|
|
|
|
int maxDegreeOfParallelism = DataflowBlockOptions.Unbounded,
|
2023-12-18 16:31:00 +01:00
|
|
|
|
TaskScheduler? scheduler = null)
|
2023-09-21 18:58:32 +02:00
|
|
|
|
{
|
2023-09-22 22:16:56 +02:00
|
|
|
|
var options = new ExecutionDataflowBlockOptions
|
2023-09-21 18:58:32 +02:00
|
|
|
|
{
|
2023-09-22 22:16:56 +02:00
|
|
|
|
MaxDegreeOfParallelism = maxDegreeOfParallelism
|
|
|
|
|
|
};
|
2023-09-21 18:58:32 +02:00
|
|
|
|
|
2023-09-22 22:16:56 +02:00
|
|
|
|
if (scheduler != null)
|
|
|
|
|
|
options.TaskScheduler = scheduler;
|
2023-09-21 18:58:32 +02:00
|
|
|
|
|
2023-09-22 22:16:56 +02:00
|
|
|
|
var block = new ActionBlock<T>(body, options);
|
2023-09-21 18:58:32 +02:00
|
|
|
|
|
2023-09-22 22:16:56 +02:00
|
|
|
|
await foreach (var item in source)
|
|
|
|
|
|
block.Post(item);
|
2023-09-21 18:58:32 +02:00
|
|
|
|
|
2023-09-22 22:16:56 +02:00
|
|
|
|
block.Complete();
|
|
|
|
|
|
await block.Completion;
|
|
|
|
|
|
}
|
2023-09-21 18:58:32 +02:00
|
|
|
|
|
2023-09-22 22:16:56 +02:00
|
|
|
|
public static async Task ParallelForEach<T>(
|
|
|
|
|
|
this IEnumerable<T> source,
|
|
|
|
|
|
Func<T, Task> body,
|
|
|
|
|
|
int maxDegreeOfParallelism = DataflowBlockOptions.Unbounded,
|
2023-12-18 16:31:00 +01:00
|
|
|
|
TaskScheduler? scheduler = null)
|
2023-09-22 22:16:56 +02:00
|
|
|
|
{
|
|
|
|
|
|
var options = new ExecutionDataflowBlockOptions
|
2023-09-21 18:58:32 +02:00
|
|
|
|
{
|
2023-09-22 22:16:56 +02:00
|
|
|
|
MaxDegreeOfParallelism = maxDegreeOfParallelism
|
|
|
|
|
|
};
|
2023-09-21 18:58:32 +02:00
|
|
|
|
|
2023-09-22 22:16:56 +02:00
|
|
|
|
if (scheduler != null)
|
|
|
|
|
|
options.TaskScheduler = scheduler;
|
2023-09-21 18:58:32 +02:00
|
|
|
|
|
2023-09-22 22:16:56 +02:00
|
|
|
|
var block = new ActionBlock<T>(body, options);
|
2023-09-21 18:58:32 +02:00
|
|
|
|
|
2023-09-22 22:16:56 +02:00
|
|
|
|
foreach (var item in source)
|
|
|
|
|
|
block.Post(item);
|
2023-09-21 18:58:32 +02:00
|
|
|
|
|
2023-09-22 22:16:56 +02:00
|
|
|
|
block.Complete();
|
|
|
|
|
|
await block.Completion;
|
2023-09-21 18:58:32 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|