コード例 #1
0
        public async Task Should_execute_in_correct_order()
        {
            //arrange
            var semaphore = new SemaphoreQueue(1);
            var numbers   = new int[5000];
            var tasks     = new List <Task>();

            //act
            for (var i = 0; i < 5000; i++)
            {
                var intCopy = i;
                tasks.Add(semaphore.WaitAsync(CancellationToken.None).ContinueWith(task =>
                {
                    semaphore.Release();
                    return(numbers[intCopy] = intCopy);
                }));
            }

            await Task.WhenAll(tasks);

            //assert
            for (var i = 0; i < 5000; i++)
            {
                numbers[i].Should().Be(i);
            }
        }
コード例 #2
0
        /// <summary>
        ///     Starts receiving and sending data.
        /// </summary>
        /// <exception cref="SslException">If SSL is enabled</exception>
        public void Initialize()
        {
            if (Connected)
            {
                return;
            }
            Socket.NoDelay = true;
            _stream        = new NetworkStream(Socket);
            if (SslMode != SslMode.None)
            {
                _sslStream = _sslFactory.Build(this);
                if (SslMode == SslMode.AuthorizationOnly)
                {
                    _sslStream?.Dispose();
                    _sslStream = null;
                }
            }

            var wrapper = _services.Get <IInternalStreamWrapper>();

            _sslStream = wrapper?.Wrap(Stream);

            Connected    = true;
            LastReceived = DateTime.Now;
            _services.Attach(this);

            if (UseCustomIncomingMessageQueue)
            {
                _decoder.PacketReceived = DispatchPayloadReceived;
                CustomIncomingMessageQueue.NewClient();
            }

            if (UseCustomOutcomingMessageQueue)
            {
                CustomOutcomingMessageQueue.NewClient();
            }
            else
            {
                _sendLock = new SemaphoreQueue(1, 1);
            }

            if (!_receiveWorkerThreadRunning)
            {
                _receiveWorkerThreadRunning = true;
                if (_readAsync)
                {
                    Task.Run(ReadAsync);
                }
                else
                {
                    _receiveWorkerThread = new Thread(ReadSync)
                    {
                        IsBackground = true
                    };
                    _receiveWorkerThread.Start();
                }
            }
        }
コード例 #3
0
 protected RedisChannelReceiver(IConnectionMultiplexer connectionMultiplexer, string queueName, IProcessingSettings settings, RedisConfiguration redisConfiguration, IHostConfiguration hostConfiguration, IMessageProcessor processor)
 {
     ConnectionMultiplexer = connectionMultiplexer;
     _settings             = settings;
     _redisConfiguration   = redisConfiguration;
     _hostConfiguration    = hostConfiguration;
     _processor            = processor;
     _queueName            = queueName;
     _maxConcurrent        = new SemaphoreQueue(settings.MaxConcurrentCalls);
 }
コード例 #4
0
        public void Should_cancel()
        {
            //arrange
            var tokenSource = new CancellationTokenSource();
            var token       = tokenSource.Token;

            var semaphore = new SemaphoreQueue(1);

            tokenSource.Cancel();

            semaphore.Awaiting(x => x.WaitAsync(token))
            .Should().Throw <OperationCanceledException>();

            //assert
            semaphore.CurrentCount.Should().Be(1);
        }
コード例 #5
0
        public async Task Should_wait()
        {
            //arrange
            var semaphore = new SemaphoreQueue(1);
            var countable = new Mock <ICountable>();

            //act
#pragma warning disable 4014
            semaphore.WaitAsync(CancellationToken.None).ContinueWith(task => countable.Object.Count());
            semaphore.WaitAsync(CancellationToken.None).ContinueWith(task => countable.Object.Count());
            semaphore.WaitAsync(CancellationToken.None).ContinueWith(task => countable.Object.Count());
#pragma warning restore 4014
            await Task.Delay(500);

            //assert
            countable.Verify(x => x.Count(), Times.Once);
            semaphore.Release();
        }
コード例 #6
0
 public ThrottlingMiddleware(int maxConcurrent)
 {
     _semaphoreQueue = new SemaphoreQueue(maxConcurrent);
 }