Skip to content

Commit 4d2759c

Browse files
Fixed infinite recursion.
1 parent f6ea5bb commit 4d2759c

File tree

4 files changed

+191
-2
lines changed

4 files changed

+191
-2
lines changed

Open.ChannelExtensions.Tests/BatchTests.cs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Diagnostics;
44
using System.Linq;
5+
using System.Runtime.CompilerServices;
56
using System.Threading;
67
using System.Threading.Channels;
78
using System.Threading.Tasks;
@@ -347,5 +348,79 @@ async ValueTask Dequeue()
347348
}
348349

349350

351+
[Fact]
352+
public static async Task ReadBatchWithTimeoutEnumerableBakedIn()
353+
{
354+
var c = Channel.CreateUnbounded<int>(new UnboundedChannelOptions { SingleReader = false, SingleWriter = false });
355+
_ = Task.Run(async () => {
356+
//await Task.Delay(1000);
357+
c.Writer.TryWrite(1);
358+
c.Writer.TryWrite(2);
359+
360+
c.Writer.TryWrite(3);
361+
await Task.Delay(600);
362+
363+
c.Writer.TryWrite(4);
364+
c.Writer.TryWrite(5);
365+
Debug.WriteLine("Writing Complete.");
366+
c.Writer.Complete();
367+
});
368+
var i = 0;
369+
await foreach (var batch in c.Reader.ReadBatchEnumerableAsyncBakedIn(2, TimeSpan.FromMilliseconds(500), CancellationToken.None))
370+
{
371+
switch (i)
372+
{
373+
case 0:
374+
Assert.Equal(1, batch[0]);
375+
Assert.Equal(2, batch[1]);
376+
Debug.WriteLine("First batch received: " + string.Join(',', batch.Select(item => item)));
377+
break;
378+
case 1:
379+
Assert.Equal(1, batch.Count);
380+
Assert.Equal(3, batch[0]);
381+
Debug.WriteLine("Second batch received: " + string.Join(',', batch.Select(item => item)));
382+
break;
383+
case 2:
384+
Assert.Equal(4, batch[0]);
385+
Assert.Equal(5, batch[1]);
386+
Debug.WriteLine("Third batch received: " + string.Join(',', batch.Select(item => item)));
387+
break;
388+
default:
389+
throw new Exception("Shouldn't arrive here. Got batch: " + string.Join(',', batch.Select(item => item)));
390+
}
391+
i++;
392+
}
393+
Assert.Equal(3, i);
394+
await c.Reader.Completion; // Propagate possible failure
395+
}
396+
public static async IAsyncEnumerable<IList<T>> ReadBatchEnumerableAsyncBakedIn<T>(
397+
this ChannelReader<T> channelReader,
398+
int batchSize,
399+
TimeSpan timeout,
400+
[EnumeratorCancellation] CancellationToken cancellationToken = default)
401+
{
402+
var reader = channelReader.Batch(batchSize);
403+
reader = reader.WithTimeout(timeout); // stack overflow here
404+
while (true)
405+
{
406+
List<T> item;
407+
try
408+
{
409+
item = await reader.ReadAsync(cancellationToken).ConfigureAwait(false);
410+
}
411+
catch (OperationCanceledException)
412+
{
413+
cancellationToken.ThrowIfCancellationRequested();
414+
yield break;
415+
}
416+
catch (ChannelClosedException)
417+
{
418+
yield break;
419+
}
420+
421+
if (item?.Count > 0) yield return item;
422+
}
423+
}
424+
350425
}
351426

Open.ChannelExtensions/BatchingChannelReader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ protected void RefreshTimeout()
9797
/// </param>
9898
/// <inheritdoc cref="WithTimeout(long)"/>
9999
public BatchingChannelReader<T> WithTimeout(TimeSpan timeout)
100-
=> WithTimeout(TimeSpan.FromMilliseconds(timeout.TotalMilliseconds));
100+
=> WithTimeout((long)timeout.TotalMilliseconds);
101101

102102
/// <inheritdoc />
103103
protected override void OnBeforeFinalFlush()

Open.ChannelExtensions/Documentation.xml

Lines changed: 114 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Open.ChannelExtensions/Open.ChannelExtensions.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<RepositoryUrl>https://github.com/Open-NET-Libraries/Open.ChannelExtensions</RepositoryUrl>
2121
<RepositoryType>git</RepositoryType>
2222
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
23-
<Version>5.1.2</Version>
23+
<Version>5.1.3</Version>
2424
<PackageReleaseNotes></PackageReleaseNotes>
2525
<PackageLicenseExpression>MIT</PackageLicenseExpression>
2626
<PublishRepositoryUrl>true</PublishRepositoryUrl>

0 commit comments

Comments
 (0)