2010-08-02 60 views
2

我要实现以下逻辑:事件养在另一个线程

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阻止线程,所以SomeEvent应该在另一个线程中引发。但我怎么能保证呢?

回答

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

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