HardWorkingService.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using Dto;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Configuration;
  6. using System.Data;
  7. using System.Diagnostics;
  8. using System.Linq;
  9. using System.Messaging;
  10. using System.ServiceProcess;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. namespace HardWorkingService
  14. {
  15. public partial class HardWorkingService : ServiceBase
  16. {
  17. #region OperationMessageQueue
  18. private MessageQueue _OperationMessageQueue;
  19. protected MessageQueue OperationMessageQueue
  20. {
  21. get
  22. {
  23. if (_OperationMessageQueue == null)
  24. {
  25. _OperationMessageQueue = new MessageQueue(ConfigurationManager.AppSettings["OperationMessageQueuePath"]);
  26. _OperationMessageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(QueuedWorkItem) });
  27. _OperationMessageQueue.ReceiveCompleted += Mq_ReceiveCompleted;
  28. }
  29. return _OperationMessageQueue;
  30. }
  31. }
  32. #endregion
  33. private void Mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
  34. {
  35. using (var msg = OperationMessageQueue.EndReceive(e.AsyncResult))
  36. {
  37. try
  38. {
  39. var qItem = msg.Body as QueuedWorkItem;
  40. ProcessQueuedWorkItem(qItem);
  41. }
  42. catch (Exception ex)
  43. {
  44. //TODO : Write to the log we failed in some way
  45. Environment.Exit(Environment.ExitCode);
  46. }
  47. }
  48. OperationMessageQueue.BeginReceive();
  49. }
  50. private void ProcessQueuedWorkItem(QueuedWorkItem item)
  51. {
  52. //ok, so obviously here is where you're going to do your long-running logic.
  53. //for purposes of this demo, we're just going to do some bogus work
  54. NamedPipe.Sender.SendMessage(String.Format("Starting work on {0}", item.Name));
  55. var delay = new TimeSpan(0,0,3);
  56. for(var i = 0; i < 5; i++)
  57. {
  58. NamedPipe.Sender.SendMessage(String.Format("beginning work on item {0} of 5 for {1}", i, item.Name));
  59. System.Threading.Thread.Sleep(delay);
  60. NamedPipe.Sender.SendMessage(String.Format("completed work on item {0} of 5 for {1}", i, item.Name));
  61. }
  62. NamedPipe.Sender.SendMessage(String.Format("Completed work on {0}", item.Name));
  63. }
  64. public HardWorkingService()
  65. {
  66. InitializeComponent();
  67. }
  68. protected override void OnStart(string[] args)
  69. {
  70. OperationMessageQueue.BeginReceive();
  71. }
  72. protected override void OnStop()
  73. {
  74. OperationMessageQueue.ReceiveCompleted -= Mq_ReceiveCompleted;
  75. OperationMessageQueue.Dispose();
  76. }
  77. protected override void OnPause()
  78. {
  79. OperationMessageQueue.ReceiveCompleted -= Mq_ReceiveCompleted;
  80. }
  81. protected override void OnContinue()
  82. {
  83. OperationMessageQueue.ReceiveCompleted += Mq_ReceiveCompleted;
  84. OperationMessageQueue.BeginReceive();
  85. }
  86. }
  87. }