insight/src/Server/Insight.Server/Extensions/Async.cs

53 lines
1.4 KiB
C#
Raw Normal View History

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
}
}