2

我有一个从第三方库引发的事件,它在后台线程上执行。此事件主要通知侦听器库正在监视的系统中的状态更新。如果 InvokeRequired 为 true,则处理程序在 UI 线程上调用自身,然后在任何一种情况下继续将状态更改条目附加到文本框中的文本,并在托盘中弹出通知。

现在,问题是这些状态更新可以非常迅速地到来。被监控的系统可以在几毫秒内从其“空闲”状态通过几个中间体进入“就绪”状态。我需要知道系统已经过渡到所有这些中间状态;但是,并非所有状态更改都进入日志。设置断点并单步执行处理程序会显示最奇怪的行为;处理程序将单步执行前几行代码,然后跳回方法的入口。就好像事件或 Windows 消息泵正在中止方法调用,因为对同一方法的另一个调用即将到来。将方法体放在锁块中并不能解决它。

我以前在其他不使用此第三方库的项目中看到过这种情况。我并不担心,因为快速事件只是触发窗口重绘。如果它们都发生了,那就太好了,但是如果其中一个短路了,那么管道中还有另一个会通过。然而,这是一项对应用程序更为关键的任务,必须在每次引发事件时按顺序执行(它不必像状态实际变化那样快;绝对不会发生这种情况)。

这种短路行为的原因是什么,我该如何阻止它?

4

2 回答 2

2

您看到的很可能是从后台线程对事件处理程序的新调用,而您第一次开始单步执行的调用仍在运行。

于 2012-12-05T18:22:55.093 回答
0

而不是在线程中同步完成所有工作,事件处理程序在其中触发可能会在另一个线程中完成工作是有益的。

只需将您在当前事件处理程序中所做的一切包装在 中Task.Factory.StartNew,或用于BeginInvoke编组到 UI 线程而不是Invoke.

我无法确定,因为我对该库一无所知,但可能是它无法触发更多事件,直到它完成执行前一个事件的所有事件处理程序。

您可能需要做的另一个选择是解决这个问题,或者防止您的 UI 因如此多的更新而对您生气,是将状态更改作为进来并将它们转储到集合中,然后只需定期检查该集合并批量处理所有更改。这在第 3 方对象的事件处理程序上会更容易,因为它只需要将项目添加到集合中,并且在 UI 上也会更容易,因为它不需要在监视器甚至可以的时间跨度内更新多次呈现更改。

于 2012-12-05T18:24:45.683 回答