Browse Source

Improved the stability of this task.

pull/325/head
Sebastian 8 years ago
parent
commit
c7ba279df7
  1. 17
      src/Squidex.Infrastructure.MongoDb/MongoDb/MongoExtensions.cs
  2. 1
      tests/Squidex.Infrastructure.Tests/MongoDb/MongoExtensionsTests.cs

17
src/Squidex.Infrastructure.MongoDb/MongoDb/MongoExtensions.cs

@ -160,20 +160,25 @@ namespace Squidex.Infrastructure.MongoDb
} }
public static async Task ForEachPipelineAsync<TDocument>(this IAsyncCursor<TDocument> source, Func<TDocument, Task> processor, CancellationToken cancellationToken = default(CancellationToken)) public static async Task ForEachPipelineAsync<TDocument>(this IAsyncCursor<TDocument> source, Func<TDocument, Task> processor, CancellationToken cancellationToken = default(CancellationToken))
{
using (var selfToken = new CancellationTokenSource())
{
using (var combined = CancellationTokenSource.CreateLinkedTokenSource(selfToken.Token, cancellationToken))
{ {
var actionBlock = var actionBlock =
new ActionBlock<TDocument>(processor, new ActionBlock<TDocument>(async x =>
{
if (!combined.IsCancellationRequested)
{
await processor(x);
}
},
new ExecutionDataflowBlockOptions new ExecutionDataflowBlockOptions
{ {
MaxDegreeOfParallelism = 1, MaxDegreeOfParallelism = 1,
MaxMessagesPerTask = 1, MaxMessagesPerTask = 1,
BoundedCapacity = 100 BoundedCapacity = 100
}); });
using (var selfToken = new CancellationTokenSource())
{
using (var combined = CancellationTokenSource.CreateLinkedTokenSource(selfToken.Token, cancellationToken))
{
try try
{ {
await source.ForEachAsync(async i => await source.ForEachAsync(async i =>

1
tests/Squidex.Infrastructure.Tests/MongoDb/MongoExtensionsTests.cs

@ -151,6 +151,7 @@ namespace Squidex.Infrastructure.MongoDb
} }
result.Add(x); result.Add(x);
return TaskHelper.Done; return TaskHelper.Done;
}, cts.Token); }, cts.Token);
}); });

Loading…
Cancel
Save