2010-08-02 63 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()方法)。