private void ReadTraceMessages() { while (!_traceMessages.IsCompleted) { try { ITraceMessage traceMessage = null; if (!_cancellationTokenSource.IsCancellationRequested) { try { traceMessage = _traceMessages.Take(_cancellationTokenSource.Token); } catch (OperationCanceledException) { if (_traceMessages.IsCompleted) { return; } continue; } } if (traceMessage == null) { if (!_traceMessages.TryTake(out traceMessage)) { var count = _traceMessages.Count; if (count > 0) { _errorHandler.HandleError($"Cannot take a trace message from the collection having a count of {count}."); } return; } } if (!(traceMessage is MethodVisitTraceMessage)) { throw new InvalidOperationException($"Detected unknown trace message of type {traceMessage.GetType().FullName}."); } var methodVisitTraceMessage = (MethodVisitTraceMessage)traceMessage; MethodEntry(methodVisitTraceMessage.ClassName, methodVisitTraceMessage.SourceFile, methodVisitTraceMessage.MethodName, methodVisitTraceMessage.MethodSignature, methodVisitTraceMessage.StartLineNumber, methodVisitTraceMessage.EndLineNumber); } catch (Exception ex) { _errorHandler.HandleError("Unexpected error occurred while reading from trace messages queue.", ex); } } }