Hi,

I'm creating a custom AsyncAppender() that buffers synchronous event appends
, using an internal dequeue thread to process these buffered events sending
them onto attached appenders. The internal workings are not important to my
problem (I think)... 

 

What I'm seeing is that neither the Close() or ~AsyncAppender() (finalize)
methods are being called when my test program attempts to exit i.e. my test
program hangs. This is important because my class cleanup triggers the
dequeue thread to drain any buffered events, terminate the thread and
dispose. If not triggered the dequeue thread sits there waiting on an
autoReset event for ever - hence the program hang.

 

However, If I explicitly shutdown the repository, Close() is called and it
all works perfectly.

 

        logger.Logger.Repository.Shutdown();

 

AsyncAppender inherits AppenderSkeleton so overrides OnClose(). It also
implements IDisposable using the classic Dispose pattern.

My test program is configuring everything programmatically (no config files)
so I can see what's going on - well that was the idea J

 

I would have thought that when my program exited, Log4net would be garbage
collected and my Close() (or destructor) method would be called.

 

What am I doing wrong?

 

I can include some code later but I really want to get an idea of the
appender lifecycle.

Thanks

Michael

 

 

Reply via email to