123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- using System;
- using System.Collections.Generic;
- using System.Threading;
- namespace Wayne.Lib.Log
- {
- internal class LoggerThread : IDisposable
- {
- #region Fields
- private readonly Thread thread;
- private readonly AutoResetEvent waitEvent;
- private readonly Queue<LogEntry> entryQueue = new Queue<LogEntry>();
- private readonly object entryQueueLock = new object();
- private readonly object logWritingLock = new object();
- private bool threadShouldExit;
- private bool disposed;
- private readonly LogConfig logConfig;
- #endregion
- #region Construction & Finalizer
-
-
-
-
-
- public LoggerThread(LogType logType, LogConfig logConfig)
- {
- this.logConfig = logConfig;
-
- waitEvent = new AutoResetEvent(false);
-
-
-
-
-
-
-
-
-
-
-
-
-
- }
-
-
-
- ~LoggerThread()
- {
- Dispose(false);
- }
- #endregion
- #region IDisposable Members
-
-
-
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
-
-
-
-
- private void Dispose(bool disposing)
- {
- if (!disposed)
- {
- disposed = true;
- if (disposing)
- {
- threadShouldExit = true;
- waitEvent.Set();
- waitEvent.Close();
- thread.Join();
- }
- }
- }
- #endregion
- #region The thread method
-
-
-
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2102:CatchNonClsCompliantExceptionsInGeneralHandlers")]
- private void Execute()
- {
- while (!threadShouldExit)
- {
- try
- {
-
- waitEvent.WaitOne();
- if (!disposed)
- {
-
- bool queueEmpty;
- do
- {
-
- LogEntry logEntry = null;
- lock (entryQueueLock)
- {
- if (entryQueue.Count > 0)
- logEntry = entryQueue.Dequeue();
- queueEmpty = (entryQueue.Count == 0);
- }
-
-
- if (!disposed && (logEntry != null))
- PerformLog(logEntry);
- }
- while (!queueEmpty);
- }
- }
- catch (Exception exception)
- {
-
-
- }
- #if WindowsCE
- catch
- {
- Logger.FireOnThreadException(new LogException(LogExceptionType.GeneralThreadException,
- "An unknown exception is caught in the Logger.Execute() method."));
- }
- #endif
- }
- }
-
-
-
-
- private void PerformLog(LogEntry logEntry)
- {
- lock (logWritingLock)
- {
- UnregisterEntity unregisterEntity = logEntry as UnregisterEntity;
- if (unregisterEntity != null)
- {
- logConfig.UnregisterEntity(unregisterEntity.EntityCategory.Entity);
- return;
- }
- LogWriter[] logWriters;
- DebugMarkerLogEntry debugMarkerLogEntry = logEntry as DebugMarkerLogEntry;
- if (debugMarkerLogEntry != null)
- {
-
- logWriters = logConfig.GetLogWriters();
- }
- else
- {
-
- logWriters = logConfig.GetLogWriters(logEntry.EntityCategory);
- }
-
- foreach (LogWriter writer in logWriters)
- writer.Write(logEntry);
- }
- }
- #endregion
- #region Public Methods
-
-
-
-
- public void AddEntry(LogEntry logEntry)
- {
- if (disposed)
- return;
-
-
-
-
-
- {
- lock (entryQueueLock)
- {
- entryQueue.Enqueue(logEntry);
- }
- waitEvent.Set();
- }
- }
- #endregion
- }
- }
|