【发布时间】:2016-03-23 12:23:26
【问题描述】:
环境
- 宿主应用程序是 Windows 服务 (.NET 3.5);
- 目前还不能切换到 .NET 4+ 框架。
过程
- 处理一封邮件最多可能需要 5 分钟。
-
使用异步模式接收消息(
ReceiveCompleted事件订阅):private void OnMessageReceived(object source, ReceiveCompletedEventArgs eventArgs) { var queue = (MessageQueue)source; Message m = null; try { var processor = new Thread(() => { try { // 1. process the message // 2. send a feedback to m's response queue } catch(Exception ex) { Logger.Log.Error(ex); // 1. send a feedback to m's response queue } }; processor.Start(); } catch(Exception ex) { Logger.Log.Error(ex); } queue.BeginReceive(); }
问题
我猜在产生单独的工作线程之后应该有一些限制。
假设我想使用 1-5 个工作线程(最多)处理消息,如果所有可用工作线程都忙,那么:
- 当前消息的处理被省略,反馈被发送到响应队列(消息丢失);
- 消息被发送回队列,反馈被发送(处理被推迟);
如果所有可用的工作人员都忙这部分是否意味着我必须实现类似于线程池的东西?
我已将system.reactive 添加到问题中。这是由于我看到使用 Rx Buffering 的一些代码。我不太明白这是否适用于我的情况。我可以在我的情况下使用 Rx 吗?
【问题讨论】:
标签: system.reactive .net multithreading system.reactive msmq messaging