private async Task <OperationResult <ChannelState> > ReadWithTimeoutAsync(AsynchronousReadingOperation readingOperation, TimeSpan timeout)
        {
            ThrowIfDisposed();

            bool gainedExclusiveAccess = false;

            try
            {
                var status = await AsyncHelper.GetTaskForWaitHandle(_exclusiveAccessSemaphore, timeout);

                if (status != OperationStatus.Completed)
                {
                    return(new OperationResult <ChannelState>(status, null));
                }

                gainedExclusiveAccess = true;

                return(await ReadAndSetEventsAsync(readingOperation));
            }
            finally
            {
                if (gainedExclusiveAccess)
                {
                    _exclusiveAccessSemaphore.Release();
                }
            }
        }
示例#2
0
        public async Task <OperationResult <ChannelState> > ReadAsync(AsynchronousReadingOperation readingOperation)
        {
            var header = Header.Read(_headerView);

            if (header.HeadNode < 0)
            {
                return(new OperationResult <ChannelState>(OperationStatus.QueueIsEmpty, new ChannelState(header)));
            }

            var offset = header.HeadNode;

            var node = Node.Read(_file, header.HeadNode);

            var status = await readingOperation.ReadAsync(_file, header.HeadNode + _sizeOfNode, node.Length);

            if (status == OperationStatus.Cancelled || status == OperationStatus.DelegateFailed)
            {
                return(new OperationResult <ChannelState>(status, new ChannelState(header)));
            }

            header.HeadNode = node.Next;

            header.ActiveNodes -= 1;

            ReturnSpaceToFreeList(offset, _sizeOfNode + node.Length, ref header);

            Header.Write(_headerView, ref header);

            return(new OperationResult <ChannelState>(status, new ChannelState(header)));
        }
        private async Task <OperationResult <ChannelState> > ReadAndSetEventsAsync(AsynchronousReadingOperation readingOperation)
        {
            var result = await((ReaderMemoryManager)_memoryManager).ReadAsync(readingOperation);

            var channelState = result.Data;

            if (channelState != null && channelState.MessagesCount == 0)
            {
                _hasMessagesEvent.Reset();

                _noMessagesEvent.Set();
            }

            return(result);
        }