C#-method在事件发生后调用主线程。然后另一个事件是在第一个事件忙于相同的方法期间触发相同的方法。所以在调试过程中,我在同一个线程的同一个方法中看到调用堆栈中的两行。
如何使用相同的方法阻止第二个事件在第一个事件准备就绪之前等待。我正在尝试使用lock()但它不会阻止同一个线程。 AutoResetEvent可以等待但是将在同一个线程上等待。
有人有提示吗?感谢。
答案 0 :(得分:2)
您的问题是由Application.DoEvents()
引起的。这种方法确实有其用途,但它很危险,你偶然发现了一个原因:重新调用事件。
所以,试试
private bool busy = false;
private void MyHandler(sender s, EventArgs e)
{
if (busy)
return; // giving up, no queuing
busy = true;
// code
busy = false; // maybe in a finally clause
}
答案 1 :(得分:0)
您可以使用MethodImplAttribute属性标记方法。
[MethodImpl(MethodImplOptions.Synchronized)]
void Method()
{
....
}
MethodImplOptions.Synchronized
指定该方法一次只能由一个线程执行。静态方法锁定类型,而实例方法锁定实例。只有一个线程可以在任何实例函数中执行,并且只有一个线程可以在任何类的静态函数中执行。