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(); } } }
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); }