Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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#_Event Handling - Fatal编程技术网

C# 确保一次仅运行一个事件处理程序实例

C# 确保一次仅运行一个事件处理程序实例,c#,event-handling,C#,Event Handling,我有一个与HID设备交互的应用程序,在速度较慢的机器上,当我订阅收到HID报告时引发的onReport事件时,它似乎会挂断自己,我怀疑这是因为它可能在前一个事件处理程序完成其任务之前启动了事件处理程序的新实例 有没有办法确保在前一个事件处理程序完成其任务之前忽略报告?我在考虑一个静态变量,处理程序可以将其设置为其最后一个操作,但如果存在,我想在.net中内置一些东西。您可以使用线程同步机制来确保只有onle线程可以同时运行特定的代码段。在谷歌搜索线程同步 P>最简单的解决方案是使用锁机制: l

我有一个与HID设备交互的应用程序,在速度较慢的机器上,当我订阅收到HID报告时引发的onReport事件时,它似乎会挂断自己,我怀疑这是因为它可能在前一个事件处理程序完成其任务之前启动了事件处理程序的新实例


有没有办法确保在前一个事件处理程序完成其任务之前忽略报告?我在考虑一个静态变量,处理程序可以将其设置为其最后一个操作,但如果存在,我想在.net中内置一些东西。

您可以使用线程同步机制来确保只有onle线程可以同时运行特定的代码段。在谷歌搜索线程同步

<> P>最简单的解决方案是使用锁机制:

lock (lockObject)
{
    // The code that you put here can be run only on one thread at the same time...
    // ...
}

您还可以引入一些字段,这些字段将标记代码的特定部分是否已经执行。

那么,事件是在哪个线程上处理的?如果不知道引发事件的原因,或者基本上不知道更多的上下文,那么就很难知道最好的解决方案。@JonSkeet每个HID设备都有自己的线程,并且事件在设备线程中处理。那么,不同HID的事件处理程序是相互交互的吗?你能避免吗?最好不要仅仅因为一个HID事件处理程序尚未完成就阻止所有HID事件处理程序…@JonSkeet他们没有相互交互,只是有时报告的速度比应用程序处理它们的速度快,我认为这会导致单个设备的多个事件处理程序实例同时处于活动状态。不,如果是如您所说的:事件在设备线程中处理——一个线程一次只能做一件事,除非您有意引入可重入性。