1

AC#-方法在事件引发后调用主线程。然后在第一个事件忙于相同方法期间,另一个事件正在触发相同的方法。所以在调试过程中,我在调用堆栈中看到同一线程上同一方法中的两行。

我怎么能阻止第二个事件等到第一个事件用相同的方法准备好。我正在尝试使用 lock() 但它不会阻塞同一个线程。AutoResetEvent 可以等待,但将在同一个线程上等待。

有人有诀窍吗?谢谢。

4

2 回答 2

2

你的问题是由Application.DoEvents(). 这种方法确实有它的用途,但它很危险,你偶然发现了其中一个原因:对事件的重入调用。

所以,试试

  1. 删除并避免 DoEvents()。
  2. 或使您的所有事件处理程序能够或抵抗重入。例如,仔细看看关闭按钮可能会出现哪些情况。一个简单的技巧可能是:
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
}
于 2012-05-26T19:05:34.617 回答
0

您可以使用MethodImplAttribute属性标记方法。

例子:

[MethodImpl(MethodImplOptions.Synchronized)]
void Method()
{
   ....
}

文档(MSDN):

MethodImplOptions.Synchronized

指定该方法一次只能由一个线程执行。静态方法锁定类型,而实例方法锁定实例。只有一个线程可以在任何实例函数中执行,并且只有一个线程可以在任何类的静态函数中执行。

于 2012-05-26T15:01:10.347 回答