在另一个线程中提升事件

时间:2010-08-02 05:06:57

标签: .net multithreading

我想实现以下逻辑:

  private static AutoResetEvent _autoResetEvent = new AutoResetEvent(false);

  static void Main(string[] args)
  {
     var someObjectInstance = new SomeObject();
     someObjectInstance.SomeEvent += SomeEventHandler;
     _autoResetEvent.WaitOne();
     //...
  }

  static void SomeEventHandler()
  {
     _autoResetEvent.Set();
  }

所以Main方法应该等到第一次调用SomeEvent。据我所知_autoResetEvent.WaitOne阻塞线程所以应该在另一个线程中引发SomeEvent。但我怎么能保证呢?

2 个答案:

答案 0 :(得分:0)

一旦主线程将到达_autoResetEvent.WaitOne(),它将被阻止,直到将发出该事件对象的信号。如果AutoResetEvent对象永远不会发出信号,那么等待WaitOne()的线程将无限期地阻塞(假设没有人在主线程上抛出InterruptException,并且没有超时值传递给WaitOne()方法)。

答案 1 :(得分:0)

所以你想从另一个线程中引发事件?以下代码就是这样做的。

public class Program
{
  private static AutoResetEvent _autoResetEvent = new AutoResetEvent(false); 

  static void Main(string[] args) 
  { 
    var someObjectInstance = new SomeObject(); 
    someObjectInstance.SomeEvent += SomeEventHandler;
    var thread = new Thread(
      () =>
      {
        someObjectInstance.DoSomethingThatRaisesSomeEvent();
      });
    thread.Start();
    _autoResetEvent.WaitOne(); 
    //... 
  } 

  static void SomeEventHandler() 
  { 
    _autoResetEvent.Set(); 
  }
}