Пример #1
0
        public async void Normal_2_Consumers()
        {
            var push = new MulticastAsyncEnumerable <int>();

            var en1 = push.GetAsyncEnumerator();

            var task1 = Task.Run(async() =>
            {
                await en1.AssertResult(1, 2, 3, 4, 5);
            });

            var en2   = push.GetAsyncEnumerator();
            var task2 = Task.Run(async() =>
            {
                await en2.AssertResult(1, 2, 3, 4, 5);
            });

            for (var i = 1; i <= 5; i++)
            {
                await push.Next(i);
            }
            await push.Complete();

            await task1;
            await task2;
        }
Пример #2
0
        public async void Error_2_Consumers()
        {
            var push = new MulticastAsyncEnumerable <int>();

            var en1 = push.GetAsyncEnumerator();


            var en2 = push.GetAsyncEnumerator();

            var task1 = Task.Run(async() =>
            {
                await en1.AssertFailure(typeof(InvalidOperationException), 1, 2, 3, 4, 5);
            });
            var task2 = Task.Run(async() =>
            {
                await en2.AssertFailure(typeof(InvalidOperationException), 1, 2, 3, 4, 5);
            });

            for (var i = 1; i <= 5; i++)
            {
                await push.Next(i);
            }
            await push.Error(new InvalidOperationException());

            await task1;
            await task2;
        }
        public async void Push()
        {
            for (var i = 0; i < 10; i++)
            {
                var push = new MulticastAsyncEnumerable <int>();

                var en = AsyncEnumerable.Merge(
                    push.Filter(v => v % 2 == 0),
                    push.Filter(v => v % 2 != 0)
                    )
                         .ToListAsync();

                var t = Task.Run(async() =>
                {
                    for (var j = 0; j < 100_000; j++)
                    {
                        await push.Next(j);
                    }
                    await push.Complete();
                });

                var list = await en;

                await t;

                var set = new HashSet <int>(list);

                Assert.Equal(100_000, set.Count);
            }
        }
Пример #4
0
        public async void Error_No_Consumers()
        {
            var push = new MulticastAsyncEnumerable <int>();

            for (var i = 1; i <= 5; i++)
            {
                await push.Next(i);
            }
            await push.Error(new InvalidOperationException());

            await push.AssertFailure(typeof(InvalidOperationException));
        }
Пример #5
0
        public async void Normal_No_Consumers()
        {
            var push = new MulticastAsyncEnumerable <int>();

            for (var i = 1; i <= 5; i++)
            {
                await push.Next(i);
            }
            await push.Complete();

            await push.AssertResult();
        }
        public async void Normal()
        {
            var push = new MulticastAsyncEnumerable <int>();
            var en   = push.Latest().GetAsyncEnumerator();

            try
            {
                await push.Next(1);

                Assert.True(await en.MoveNextAsync());

                Assert.Equal(1, en.Current);

                await push.Next(2);

                await push.Next(3);

                await Task.Delay(200);

                Assert.True(await en.MoveNextAsync());

                Assert.Equal(3, en.Current);

                await push.Next(4);

                await push.Complete();

                Assert.True(await en.MoveNextAsync());

                Assert.Equal(4, en.Current);
                Assert.False(await en.MoveNextAsync());
            }
            finally
            {
                await en.DisposeAsync();
            }
        }
 private async void OnReceivedMessage(MqttApplicationMessageReceivedEventArgs args)
 {
     // What about error handling?
     try
     {
         using (await _asyncLock.WaitAsync())
         {
             Debug.WriteLine($"{args.ApplicationMessage.Topic}: {Encoding.UTF8.GetString(args.ApplicationMessage.Payload)}");
             if (!args.ProcessingFailed)
             {
                 await _receivedMessages.Next(args.ApplicationMessage);
             }
         }
     }
     catch (Exception e)
     {
         await _receivedMessages.Error(e);
     }
 }
        public IAsyncEnumerable <TResult> ExecuteParallelAsync(IAsyncEnumerable <AsyncStreamQueueItem <TResult, TSource> > inputItems, int maxConcurrentTasks, CancellationToken cancellationToken)
        {
            var throttler = new SemaphoreSlim(maxConcurrentTasks);
            var nextLock  = new SemaphoreSlim(1, 1);

            var multicastStream = new MulticastAsyncEnumerable <TResult>();

            HashSet <Task> runningStreams = new HashSet <Task>();

            HandleInputStreams();

            return(multicastStream);

            async void HandleInputStreams()
            {
                try
                {
                    await foreach (AsyncStreamQueueItem <TResult, TSource> inputItem in inputItems.WithCancellation(cancellationToken))
                    {
                        var stream = ExecuteItem(throttler, inputItem, cancellationToken);
                        lock (runningStreams)
                        {
                            runningStreams.Add(ConsumeSubStream(stream));
                        }
                    }

                    await Task.WhenAll(runningStreams);

                    await nextLock.WaitAsync(cancellationToken);

                    try
                    {
                        await multicastStream.Complete();
                    }
                    finally
                    {
                        nextLock.Release();
                    }
                }
                catch (Exception e)
                {
                    await multicastStream.Error(e);
                }
            }

            async Task ConsumeSubStream(IAsyncEnumerable <TResult> source)
            {
                try
                {
                    await foreach (var item in source.WithCancellation(cancellationToken))
                    {
                        await nextLock.WaitAsync(cancellationToken);

                        try
                        {
                            await multicastStream.Next(item);
                        }
                        finally
                        {
                            nextLock.Release();
                        }
                    }
                }
                catch (Exception e)
                {
                    await multicastStream.Error(e);
                }
            }
        }