有没有办法阻止事件处理程序触发自身?

时间:2014-02-21 22:16:11

标签: c# events

我有一个可以快速连续发生的事件的事件处理程序。在某些情况下,当事件再次触发时(毫秒内),处理程序仍将执行。

有没有让这些处理程序...连续?那么,在事件调用#1完成之前,事件调用#2才能启动?

如果这是一个糟糕的想法,为什么?这是一个在后台无人值守运行的批处理过程,所以我并不十分关注一个调用阻塞另一个调用的性能问题。

2 个答案:

答案 0 :(得分:3)

使用多线程控制lock。这可以防止您的代码在同一时间运行一次。

<强> EDITED
实施例:

public class Foo
{
    private static object _lockKey = new object();

    private void YourEventHandlerMethod(object sender, EventArgs e)
    {   
        lock (_lockKey)
        {
            // the code you put inside this block will be execute only
            // once at time.

            // If a second call has the intention to use this block before
            // the conclusion of the first call, the second call (the thread)
            // will be put in hold.
        }
    }
}

答案 1 :(得分:0)

有一些选项可以序列化事件的处理,这些事件可以从多个线程同时触发,或者通过re-enrancy / recursion在同一个线程上触发。

其中一个选项是使用任务计划程序。在您的方案中,任务调度程序的目的是对回调进行排队以便以后进行串行执行。众所周知的任务调度程序的概念性示例是WinForms消息循环(以Application.Run开头,使用Control.BeginInvoke排队)和WPF Dispatcher循环(以Dispatcher.Run开头,排队{{1} }或Dispatcher.BeginInvoke)。

Stephen Toub对TPL任务调度程序的一个知之甚少但非常有用的实现是StaTaskScheduler。我发布了一些基于herehere的代码(后者来自一个密切的问题Queuing Actions/Delegates for Asyncronous Execution)。

此处描述了另一个选项:Task sequencing and re-entracy

在这种情况下,处理程序组成任务,每个新处理程序在上一个任务完成时启动。