AC#-方法在事件引发后调用主线程。然后在第一个事件忙于相同方法期间,另一个事件正在触发相同的方法。所以在调试过程中,我在调用堆栈中看到同一线程上同一方法中的两行。
我怎么能阻止第二个事件等到第一个事件用相同的方法准备好。我正在尝试使用 lock() 但它不会阻塞同一个线程。AutoResetEvent 可以等待,但将在同一个线程上等待。
有人有诀窍吗?谢谢。
AC#-方法在事件引发后调用主线程。然后在第一个事件忙于相同方法期间,另一个事件正在触发相同的方法。所以在调试过程中,我在调用堆栈中看到同一线程上同一方法中的两行。
我怎么能阻止第二个事件等到第一个事件用相同的方法准备好。我正在尝试使用 lock() 但它不会阻塞同一个线程。AutoResetEvent 可以等待,但将在同一个线程上等待。
有人有诀窍吗?谢谢。
你的问题是由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
}
您可以使用MethodImplAttribute属性标记方法。
[MethodImpl(MethodImplOptions.Synchronized)]
void Method()
{
....
}
MethodImplOptions.Synchronized
指定该方法一次只能由一个线程执行。静态方法锁定类型,而实例方法锁定实例。只有一个线程可以在任何实例函数中执行,并且只有一个线程可以在任何类的静态函数中执行。