BackgroundWorkerManager.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System;
  2. using System.Collections.Generic;
  3. using Abp.Dependency;
  4. namespace Abp.Threading.BackgroundWorkers
  5. {
  6. /// <summary>
  7. /// Implements <see cref="IBackgroundWorkerManager"/>.
  8. /// </summary>
  9. public class BackgroundWorkerManager : RunnableBase, IBackgroundWorkerManager, ISingletonDependency, IDisposable
  10. {
  11. private readonly IIocResolver _iocResolver;
  12. private readonly List<IBackgroundWorker> _backgroundJobs;
  13. /// <summary>
  14. /// Initializes a new instance of the <see cref="BackgroundWorkerManager"/> class.
  15. /// </summary>
  16. public BackgroundWorkerManager(IIocResolver iocResolver)
  17. {
  18. _iocResolver = iocResolver;
  19. _backgroundJobs = new List<IBackgroundWorker>();
  20. }
  21. public override void Start()
  22. {
  23. base.Start();
  24. _backgroundJobs.ForEach(job => job.Start());
  25. }
  26. public override void Stop()
  27. {
  28. _backgroundJobs.ForEach(job => job.Stop());
  29. base.Stop();
  30. }
  31. public override void WaitToStop()
  32. {
  33. _backgroundJobs.ForEach(job => job.WaitToStop());
  34. base.WaitToStop();
  35. }
  36. public void Add(IBackgroundWorker worker)
  37. {
  38. _backgroundJobs.Add(worker);
  39. if (IsRunning)
  40. {
  41. worker.Start();
  42. }
  43. }
  44. private bool _isDisposed;
  45. public void Dispose()
  46. {
  47. if (_isDisposed)
  48. {
  49. return;
  50. }
  51. _isDisposed = true;
  52. _backgroundJobs.ForEach(_iocResolver.Release);
  53. _backgroundJobs.Clear();
  54. }
  55. }
  56. }