转载一篇老外的消息队列服务文章

太过爱你忘了你带给我的痛 2022-08-13 12:44 242阅读 0赞

接着上一篇:http://blog.csdn.net/joyhen/article/details/38534569

原文:http://www.codeproject.com/Articles/821220/Throwing-a-Great-Block

  1. using System;
  2. namespace MessagingQueueing
  3. {
  4. using System.Collections.Concurrent;
  5. using System.Threading;
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. using (MyQueue queue = new MyQueue())
  11. {
  12. for (int msgIdx = 1; msgIdx < 21; msgIdx++)
  13. {
  14. queue.AddLog(new MyMessage
  15. {
  16. MessageId = msgIdx,
  17. Message = string.Format("Message text # {0:#,##0}", msgIdx)
  18. });
  19. }
  20. }
  21. Console.ReadKey();
  22. }
  23. }
  24. class MyQueue : IDisposable
  25. {
  26. private BlockingCollection<MyMessage> messageQueue;
  27. private Thread dequeueThread;
  28. bool stopped = true;
  29. bool isStopping = false;
  30. public MyQueue()
  31. {
  32. messageQueue = new BlockingCollection<MyMessage>(new ConcurrentQueue<MyMessage>());
  33. dequeueThread = new Thread(new ThreadStart(DequeueMessageThread));
  34. dequeueThread.Name = "TransactionPostThread";
  35. dequeueThread.Start();
  36. stopped = false;
  37. }
  38. private void DequeueMessageThread()
  39. {
  40. try
  41. {
  42. while (true)
  43. {
  44. MyMessage message = messageQueue.Take();
  45. Console.WriteLine("Dequeueing: " + message.ToString());
  46. if (messageQueue.IsCompleted)
  47. {
  48. break;
  49. }
  50. }
  51. }
  52. catch (InvalidOperationException)
  53. {
  54. // if invalid op it's because queue was completed
  55. }
  56. catch (ThreadAbortException)
  57. {
  58. // Thread aborted due to queue issue, ignore
  59. }
  60. catch (Exception)
  61. {
  62. throw;
  63. }
  64. }
  65. public void AddLog(MyMessage message)
  66. {
  67. Console.WriteLine("Enqueueing: " + message.ToString());
  68. messageQueue.Add(message);
  69. }
  70. /// <summary>
  71. /// 实现IDisposable接口方法
  72. /// </summary>
  73. public void Dispose()
  74. {
  75. Dispose(false);
  76. }
  77. private void Dispose(bool fromDestructor)
  78. {
  79. isStopping = true;
  80. int logShutdownTimeout = 30000;
  81. Console.WriteLine("Shutting down queue. Waiting for dequeue thread completion.");
  82. // Signal queue that we're shutting down
  83. messageQueue.CompleteAdding();
  84. // Wait for thread to complete before exiting
  85. do
  86. {
  87. if (!dequeueThread.Join(logShutdownTimeout))
  88. {
  89. // Queue thread may be stuck. Check for items in queue and kill thread if empty
  90. if (messageQueue.Count == 0)
  91. {
  92. System.Diagnostics.Debug.Print("Aborting thread");
  93. dequeueThread.Abort();
  94. break;
  95. }
  96. }
  97. } while (dequeueThread.IsAlive);
  98. Console.WriteLine("Dequeue thread complete.");
  99. if (!fromDestructor)
  100. {
  101. GC.SuppressFinalize(this);
  102. }
  103. stopped = true;
  104. isStopping = false;
  105. }
  106. ~MyQueue()
  107. {
  108. Dispose(true);
  109. }
  110. }
  111. class MyMessage
  112. {
  113. public int MessageId { get; set; }
  114. public string Message { get; set; }
  115. public override string ToString()
  116. {
  117. return string.Format("Message with ID {0:#,##0} and value {1}.", MessageId, Message);
  118. }
  119. }
  120. }

SouthEast

发表评论

表情:
评论列表 (有 0 条评论,242人围观)

还没有评论,来说两句吧...

相关阅读

    相关 转载加盟骗局文章

    在当今的中国,各形各色的骗局可以说是五花八门,数不胜数!抛开一些小的街头骗局,大型的骗术就有传销骗局,短信中奖骗局,信用卡中奖骗局,连锁加盟骗局等等!    如果我要是问你

    相关 转载文章

    嘿,我最近接到一个 Web 项目,不过老实说,我这两年没怎么接触 Web 编程,听说 Web 技术已经发生了一些变化。听说你是这里对新技术最了解的 Web 开发工程师?