From 3f846d93b8c36fa15c426d61b93041dcc884e17d Mon Sep 17 00:00:00 2001 From: Brennan Date: Tue, 23 Apr 2019 10:08:12 -0700 Subject: [PATCH] Fix channel stream cancellation --- src/SignalR/common/Shared/AsyncEnumerableAdapters.cs | 7 +++++-- .../server/Core/src/Internal/HubMethodDescriptor.cs | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/SignalR/common/Shared/AsyncEnumerableAdapters.cs b/src/SignalR/common/Shared/AsyncEnumerableAdapters.cs index a0951b3e59..6ebd1dcb25 100644 --- a/src/SignalR/common/Shared/AsyncEnumerableAdapters.cs +++ b/src/SignalR/common/Shared/AsyncEnumerableAdapters.cs @@ -23,9 +23,12 @@ namespace Microsoft.AspNetCore.SignalR.Internal return new CancelableTypedAsyncEnumerable(asyncEnumerable, cts); } - public static IAsyncEnumerable MakeCancelableAsyncEnumerableFromChannel(ChannelReader channel, CancellationToken cancellationToken = default) + public static async IAsyncEnumerable MakeAsyncEnumerableFromChannel(ChannelReader channel, CancellationToken cancellationToken = default) { - return MakeCancelableAsyncEnumerable(channel.ReadAllAsync(), cancellationToken); + await foreach (var item in channel.ReadAllAsync(cancellationToken)) + { + yield return item; + } } private class CancelableTypedAsyncEnumerable : IAsyncEnumerable diff --git a/src/SignalR/server/Core/src/Internal/HubMethodDescriptor.cs b/src/SignalR/server/Core/src/Internal/HubMethodDescriptor.cs index 205c1ced72..c6ad4fec10 100644 --- a/src/SignalR/server/Core/src/Internal/HubMethodDescriptor.cs +++ b/src/SignalR/server/Core/src/Internal/HubMethodDescriptor.cs @@ -19,9 +19,9 @@ namespace Microsoft.AspNetCore.SignalR.Internal .GetRuntimeMethods() .Single(m => m.Name.Equals(nameof(AsyncEnumerableAdapters.MakeCancelableAsyncEnumerable)) && m.IsGenericMethod); - private static readonly MethodInfo MakeCancelableAsyncEnumerableFromChannelMethod = typeof(AsyncEnumerableAdapters) + private static readonly MethodInfo MakeAsyncEnumerableFromChannelMethod = typeof(AsyncEnumerableAdapters) .GetRuntimeMethods() - .Single(m => m.Name.Equals(nameof(AsyncEnumerableAdapters.MakeCancelableAsyncEnumerableFromChannel)) && m.IsGenericMethod); + .Single(m => m.Name.Equals(nameof(AsyncEnumerableAdapters.MakeAsyncEnumerableFromChannel)) && m.IsGenericMethod); private readonly MethodInfo _makeCancelableEnumerableMethodInfo; private Func> _makeCancelableEnumerable; @@ -53,7 +53,7 @@ namespace Microsoft.AspNetCore.SignalR.Internal if (openReturnType == typeof(ChannelReader<>)) { StreamReturnType = returnType.GetGenericArguments()[0]; - _makeCancelableEnumerableMethodInfo = MakeCancelableAsyncEnumerableFromChannelMethod; + _makeCancelableEnumerableMethodInfo = MakeAsyncEnumerableFromChannelMethod; break; } }