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