ThreadedLogger.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4. namespace MediaBrowser.Common.Logging
  5. {
  6. public abstract class ThreadedLogger : BaseLogger
  7. {
  8. Thread loggingThread;
  9. Queue<Action> queue = new Queue<Action>();
  10. AutoResetEvent hasNewItems = new AutoResetEvent(false);
  11. volatile bool terminate = false;
  12. bool waiting = false;
  13. public ThreadedLogger()
  14. : base()
  15. {
  16. loggingThread = new Thread(new ThreadStart(ProcessQueue));
  17. loggingThread.IsBackground = true;
  18. loggingThread.Start();
  19. }
  20. void ProcessQueue()
  21. {
  22. while (!terminate)
  23. {
  24. waiting = true;
  25. hasNewItems.WaitOne(10000, true);
  26. waiting = false;
  27. Queue<Action> queueCopy;
  28. lock (queue)
  29. {
  30. queueCopy = new Queue<Action>(queue);
  31. queue.Clear();
  32. }
  33. foreach (var log in queueCopy)
  34. {
  35. log();
  36. }
  37. }
  38. }
  39. protected override void LogEntry(LogRow row)
  40. {
  41. lock (queue)
  42. {
  43. queue.Enqueue(() => AsyncLogMessage(row));
  44. }
  45. hasNewItems.Set();
  46. }
  47. protected abstract void AsyncLogMessage(LogRow row);
  48. protected override void Flush()
  49. {
  50. while (!waiting)
  51. {
  52. Thread.Sleep(1);
  53. }
  54. }
  55. public override void Dispose()
  56. {
  57. Flush();
  58. terminate = true;
  59. hasNewItems.Set();
  60. base.Dispose();
  61. }
  62. }
  63. }