C# 在使用Visual Studio profiler分析争用时,如何忽略长时间运行的信号等待?

C# 在使用Visual Studio profiler分析争用时,如何忽略长时间运行的信号等待?,c#,multithreading,visual-studio,profiler,contention,C#,Multithreading,Visual Studio,Profiler,Contention,我尝试使用VisualStudio探查器分析应用程序以查看潜在的线程争用问题,但问题是探查器将等待信号视为最严重的违规行为(因为消耗线程大部分时间都在等待信号),而在现实中,更有趣的是看到生产方面的争论 例如,我正在使用log4net的异步appender来减少日志记录对实际工作人员的影响,它基本上是一个围绕BlockingCollection的包装器: 我的问题是:我做错什么了吗?使用探查器识别实际热点的正确方法是什么 readonly BlockingCollection<Loggin

我尝试使用VisualStudio探查器分析应用程序以查看潜在的线程争用问题,但问题是探查器将等待信号视为最严重的违规行为(因为消耗线程大部分时间都在等待信号),而在现实中,更有趣的是看到生产方面的争论

例如,我正在使用log4net的异步appender来减少日志记录对实际工作人员的影响,它基本上是一个围绕
BlockingCollection
的包装器:

我的问题是:我做错什么了吗?使用探查器识别实际热点的正确方法是什么

readonly BlockingCollection<LoggingEventContext> _queue;

protected override void Append(LoggingEvent e)
{
    // instead of appending, push to the queue
    _queue.Add(new LoggingEventContext(e, HttpContext), _loggingCancelationToken);
}

void StartForwarding()
{
    _queue = new BlockingCollection<LoggingEventContext>(BufferSize);

    _loggingCancelationTokenSource = new CancellationTokenSource();
    _loggingCancelationToken = _loggingCancelationTokenSource.Token;
    _loggingTask = new Task(SubscriberLoop, _loggingCancelationToken);
    _loggingTask.Start();
}
void SubscriberLoop()
{
    try
    {
        // this is the blocking call which is reported as the source of contention
        foreach (var entry in _queue.GetConsumingEnumerable(_loggingCancelationToken))
        {
            HttpContext = entry.HttpContext;
            ForwardLoggingEvent(entry.LoggingEvent, ThisType);
        }
    }
    catch (OperationCanceledException ex)
    {
        ...
    }
    catch (ThreadAbortException ex)
    {
        ...
    }
}