可以在事件处理程序方法中使用Monitor.TryEnter吗?

时间:2011-09-26 07:37:13

标签: c# event-handling locking

我有经常调用的EventHandler方法,它的正文处理需要一些时间。可以通过Monitor锁定此处理程序中的操作吗? 目的是同时锁定器锁定对象的其他事件,并简单地跳过对象的处理。

public void MyEventHandler(object sender, EventArgs e) 
{
if (!Monitor.TryEnter(locker)) return; // skipping meanwhile processing

// do some stuff here

Monitor.Exit(locker)
}

2 个答案:

答案 0 :(得分:2)

看起来它会更清洁/更高效

  • (a)防止事件被提出
  • (b)使用条件变量。

无论如何,总是将Monitor.Exit放入finally块

答案 1 :(得分:1)

这并不可怕,只要:

  • 您是在后台线程上执行此操作(或者,在事件处理线程中,您执行此操作)。
  • 您正在同步对//do some stuff代码所需内容的所有访问权限。
  • 您可以在TryEnter / try中的finally之后包装所有内容,如下所示:

public void MyEventHandler(object sender, EventArgs e)
{
    if (!Monitor.TryEnter(locker)) return;
    try
    {
        // do some stuff here
    }
    finally
    {
        Monitor.Exit(locker);
    }
}

如果你可以防止触发事件就更好了(因此避免启动一个线程可能什么都不做 - 因为你当然不会在事件处理线程上进行这个耗时的处理。 。)

或者,如果你真的需要来锁定整个持续时间(也就是说,如果事件处理程序不会做任何需要与其他代码同步的事情),你可以锁定足够长的时间来设置一个标志,比如

private Object condition_lock = new Object();
private bool handlingEvent = false;

public void MyEventHandler(object sender, EventArgs e)
{
    lock (condition_lock)
    {
        if (handlingEvent) return;
        handlingEvent = true;
    }
    try
    {
        // do some stuff here
    }
    finally
    {
        handlingEvent = false;
    }
}