方法将从一个线程调用两次以上。怎么等

时间:2012-05-26 14:50:47

标签: c# multithreading

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

如何使用相同的方法阻止第二个事件在第一个事件准备就绪之前等待。我正在尝试使用lock()但它不会阻止同一个线程。 AutoResetEvent可以等待但是将在同一个线程上等待。

有人有提示吗?感谢。

2 个答案:

答案 0 :(得分:2)

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

所以,试试

  1. 删除并避免使用DoEvents()。
  2. 或使所有你的事件处理程序能够或抵抗重新入侵。例如,使用关闭按钮仔细查看可能的场景。一个简单的伎俩可能是:
  3. 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()
{
   ....
}

文档(MSDN):

MethodImplOptions.Synchronized

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

相关问题