Multithreading Log4Net appender在IIS Express停止站点上过早停止

Multithreading Log4Net appender在IIS Express停止站点上过早停止,multithreading,iis,log4net,Multithreading,Iis,Log4net,我有一个自定义的appender,它派生自BufferingAppenderSkeleton,实现IAAppenderAttachable,并将日志事件发送到队列(实际上是发送到BlockingCollection),该队列内部添加到队列,然后通过单独的线程从该队列中删除并通过http发送日志消息 在应用程序必须关闭之前,这一切都可以正常工作。当这种情况发生时,应用程序会关闭,队列中的所有消息都会丢失。我添加了一个关闭按钮来处理该问题,并等待收集完成,但代码从来没有走得那么远,它总是突然结束。我

我有一个自定义的appender,它派生自
BufferingAppenderSkeleton
,实现
IAAppenderAttachable
,并将日志事件发送到队列(实际上是发送到
BlockingCollection
),该队列内部添加到队列,然后通过单独的线程从该队列中删除并通过http发送日志消息

在应用程序必须关闭之前,这一切都可以正常工作。当这种情况发生时,应用程序会关闭,队列中的所有消息都会丢失。我添加了一个关闭按钮来处理该问题,并等待收集完成,但代码从来没有走得那么远,它总是突然结束。我如何让它继续运行,直到队列为空或者说10秒后堂(在下面的示例中)

以下是Appender OnClose:

protected override void OnClose()
    {
        this.Flush(true);
        _handler.Close();
        this.RemoveAllAppenders();
    }
下面是处理程序(实现BlockingCollection的类)的结束:


我注意到您没有在
OnClose
@stuartd true中调用
base.OnClose();
,但我实际上是从BufferingAppenderSkeleton继承的,它也没有调用
base.OnClose();
。它只是调用
this.Flush(true);
public void Close()
    {
        _blockingCollection.CompleteAdding();
        if (!_blockingCollection.IsCompleted)
        {
            _manualResetEvent.WaitOne(10000);
        }
        Debug.WriteLine("Actually finished!");
    }