Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 事件处理程序多次快速命中似乎;短路;_C#_.net_Event Handling - Fatal编程技术网

C# 事件处理程序多次快速命中似乎;短路;

C# 事件处理程序多次快速命中似乎;短路;,c#,.net,event-handling,C#,.net,Event Handling,我有一个从第三方库引发的事件,它在后台线程上执行。此事件主要通知侦听器库正在监视的系统中的状态更新。如果InvokeRequired为true,则处理程序在UI线程上调用自身,然后在任何一种情况下,继续将状态更改的条目附加到文本框中的文本,并在任务栏中弹出一个通知 现在的问题是,这些状态更新可以很快进入;被监视的系统可以在几毫秒内从“空闲”状态通过几个中间状态变为“就绪”状态。我需要知道系统已经通过所有这些中间状态进行了转换;但是,并非所有状态更改都会进入日志。设置断点并单步执行处理程序显示了最

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

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

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


短路行为的原因是什么,如何停止它?

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

与其在线程中同步执行事件处理程序激发的所有工作,不如在另一个线程中执行该工作线

只需将当前事件处理程序中正在执行的所有操作包装在
Task.Factory.StartNew
中,或者使用
BeginInvoke
封送到UI线程,而不是
Invoke

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


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

什么是日志记录机制?可能事件B和C的日志条目失败,因为关键资源被锁定,因为它仍在记录事件a?日志非常简单;它附加到状态窗口中文本框的文本中,如果最终用户感兴趣,则会弹出一个通知。非常简单,但它们需要在UI线程中运行。如果是这种情况,我会看到光标前后跳跃,或者停留在相同的位置,因为不同的线程都在处理程序中运行。我还可以在处理程序中看到多个线程。这两种情况似乎都不是这样。@KeithS“处理程序将逐步完成前几行代码,然后跳回方法的条目”-->这是从后台线程重新输入事件处理程序时的情况。。。。但是在threads窗口中没有多个线程列在该处理程序中。我怀疑这是因为您正在主线程上调用。仍然是您正在输入事件处理程序,因为它是由后台线程调用的。好的,您是说我不需要尝试将事件向前推到UI;相反,我需要快速处理从后台线程引发的事件,可能是通过将相关信息推送到队列中,然后让其他东西在最合适的时间使用这些数据,就像Servy所说的那样。