Asynchronous log4net追加器&x27;s OnClose()不';好像不行

Asynchronous log4net追加器&x27;s OnClose()不';好像不行,asynchronous,log4net,shutdown,Asynchronous,Log4net,Shutdown,我已经编写了自己的appender来对请求进行排队,这样我就可以在另一个线程中发送请求,基本上是一个异步appender。我的appender创建一个工作线程来处理排队的请求。如果我的appender的工作线程被标记为后台线程,例如IsBackground=true,那么我的appender的OnClose()将被调用,但进程将在不等待该方法完成的情况下停止。如果我的appender的工作线程被标记为前台线程,那么我的appender的OnClose()永远不会被调用,我的应用程序也不会关闭 我

我已经编写了自己的appender来对请求进行排队,这样我就可以在另一个线程中发送请求,基本上是一个异步appender。我的appender创建一个工作线程来处理排队的请求。如果我的appender的工作线程被标记为后台线程,例如IsBackground=true,那么我的appender的OnClose()将被调用,但进程将在不等待该方法完成的情况下停止。如果我的appender的工作线程被标记为前台线程,那么我的appender的OnClose()永远不会被调用,我的应用程序也不会关闭

我的猜测是,这种行为是由于log4net如何检测应用程序关闭。将我的appender的工作线程标记为前台线程,这样log4net就不会检测到应用程序正在关闭(例如,没有域关闭事件或卸载,不管log4net使用什么来检测)。我能理解这一点,这似乎是合理的。但是,OnClose()似乎没有任何用处,因为它只在进程关闭时被调用,而关闭代码并没有等待OnClose()完成

我做错什么了吗?有没有正确的方法来清理log4net异步appender的资源

谢谢,
Nick

Log4net将关闭AppDomain.CurrentDomain.ProcessExit和AppDomain.CurrentDomain.DomainUnload事件,可能还有其他事件。可能值得一看stuartd-我检查了您提供的链接中的一些代码。不幸的是,我猜它也有同样的问题。它们将其工作线程标记为前景线程。这会导致OnClose()方法不会被调用,除非应用程序调用存储库上的Shutdown,或者至少我读到的内容会导致OnClose()被调用。我无法控制客户端应用程序,因此无法依赖于此。Log4net将关闭AppDomain.CurrentDomain.ProcessExit和AppDomain.CurrentDomain.DomainUnload事件,可能还有其他事件。可能值得一看stuartd-我检查了您提供的链接中的一些代码。不幸的是,我猜它也有同样的问题。它们将其工作线程标记为前景线程。这会导致OnClose()方法不会被调用,除非应用程序调用存储库上的Shutdown,或者至少我读到的内容会导致OnClose()被调用。我无法控制客户端应用程序,因此无法依赖它。