我有经常调用的EventHandler方法,它的正文处理需要一些时间。可以通过Monitor锁定此处理程序中的操作吗? 目的是同时锁定器锁定对象的其他事件,并简单地跳过对象的处理。
public void MyEventHandler(object sender, EventArgs e)
{
if (!Monitor.TryEnter(locker)) return; // skipping meanwhile processing
// do some stuff here
Monitor.Exit(locker)
}
答案 0 :(得分:2)
看起来它会更清洁/更高效
无论如何,总是将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;
}
}