コード例 #1
0
        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);
                }
            }
        }