代码之家  ›  专栏  ›  技术社区  ›  SiberianGuy

在另一个线程中引发事件

  •  2
  • SiberianGuy  · 技术社区  · 14 年前

    我想实现以下逻辑:

      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();
      }
    

    因此,主方法应该等到第一次调用SomeEvent。据我所知,autoResetEvent.WaitOne会阻塞线程,因此应该在另一个线程中引发某个事件。但我怎么能保证呢?

    2 回复  |  直到 14 年前
        1
  •  0
  •   Brian Gideon    14 年前

    所以你想从另一个线程引发这个事件?下面的代码就可以做到这一点。

    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(); 
      }
    }
    
        2
  •  0
  •   Liran    14 年前

    一旦主线到达 _autoResetEvent.WaitOne() ,它将被阻止,直到发出该事件对象的信号。如果 AutoResetEvent 对象从未收到信号,然后等待的线程 WaitOne() 将无限期阻止(假设没有人抛出 InterruptException 在主线程上,并且没有向 方法)。