【发布时间】:2013-11-19 12:24:39
【问题描述】:
我在 ManualResetEvent 和事件积压方面遇到了一些问题。我的应用程序正在订阅消息,然后运行一个很长的任务。
我遇到的问题是我收到的消息超出了我的处理能力。任务大约需要 5 秒来处理,但我每 2-3 秒就会收到一条新消息。
理想情况下,我想做的是忽略任何新事件,直到我完成任务处理然后再次开始“监听”。目前,我似乎正在按接收和处理的顺序积压事件。正如您可以想象的那样,几个小时后,正在处理的消息已经很旧了。
我无法从多个线程运行长时间运行的任务。
也许我需要某种排队机制,然后清除最后一条消息(Last On First Off)并删除队列?
有什么想法吗?
我还在长期运行过程结束时调用 ManualResetEvent.Set() - 根据我的研究,我知道这是正确的吗?我应该在长时间运行的任务开始时 Reset() 导致线程阻塞,然后在结束时 Set() 吗?
【问题讨论】:
-
为什么不:接收消息 -> 取消订阅 -> 处理消息 -> 重新订阅?
-
嗨,我确实想到了,但订阅/取消订阅是由第 3 方提供的,并引发了错误。我会联系他们,但希望作为一种快速的解决方法,我可以创建一个队列然后排在首位。
-
我已经开始使用后台线程来完成工作并添加了逻辑
if(bw.IsBusy != true) do_work, else continue listening for next subscription
标签: c# multithreading events .net-4.0