private void PageTracing(PagingAction action) { _stopTracePage = true; StopFind(); lock (btnNext) { btnNext.Enabled = false; btnLast.Enabled = false; btnPrevious.Enabled = false; btnTop.Enabled = false; if (_tracingPageResult != null && _tracingPageDelegate != null) { _tracingPageDelegate.EndInvoke(_tracingPageResult); } _stopTracePage = false; _tracingPageResult = _tracingPageDelegate.BeginInvoke(action, new AsyncCallback(new Action <IAsyncResult>( a => { BeginInvoke(new Action(() => { btnNext.Enabled = true; btnLast.Enabled = true; if (_currentPageTopOffset > 0 && MemoryMappedLog.TraceReader.NextReadOffset > 0) { btnPrevious.Enabled = true; btnTop.Enabled = true; } })); })), null); } }
private void TracingPageThread(PagingAction action) { int lastOffset = 0; if (action == PagingAction.Previous) { _currentPageBottomOffset = _currentPageTopOffset; lastOffset = _currentPageTopOffset; } else { _currentPageTopOffset = _currentPageBottomOffset; lastOffset = _currentPageBottomOffset; } rtbTrace.Invoke(new Action(() => rtbTrace.Text = "")); int numMessagesOutstanding = _pageSize;// + (action == PagingAction.Previous ? 1 : 0); while (!_stopTracePage && numMessagesOutstanding > 0) { List <string> messages; if (action == PagingAction.Next) { messages = MemoryMappedLog.TraceReader.ReadNextMessages( numMessagesOutstanding, lastOffset); lastOffset = MemoryMappedLog.TraceReader.NextReadOffset; // For next, we wait until N number of messages have been received. numMessagesOutstanding -= messages.Count; } else { messages = MemoryMappedLog.TraceReader.ReadPreviousMessages( numMessagesOutstanding, lastOffset); numMessagesOutstanding -= messages.Count; if (numMessagesOutstanding > 0) { messages.AddRange(MemoryMappedLog.TraceReader.ReadNextMessages(numMessagesOutstanding, lastOffset)); _currentPageBottomOffset = MemoryMappedLog.TraceReader.NextReadOffset; } // For previous, we only try to get N number of previous messages once numMessagesOutstanding = 0; } IAsyncResult appendResult = rtbTrace.BeginInvoke(new Action(() => { foreach (string message in messages) { if (_stopTracePage) { break; } AddTraceMessage(message); } })); Thread.Sleep(1); } if (action == PagingAction.Previous) { _currentPageTopOffset = MemoryMappedLog.TraceReader.NextReadOffset; } else { _currentPageBottomOffset = MemoryMappedLog.TraceReader.NextReadOffset; } }