2010-08-02 4 views
2

Je veux mettre en œuvre la logique suivante:événement de collecte dans un autre thread

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

donc la méthode principale devrait attendre jusqu'à ce que SomeEvent est appelé la première fois. Si je comprends bien, _autoResetEvent.WaitOne bloque le thread afin que SomeEvent soit levé dans un autre thread. Mais comment puis-je le garantir?

Répondre

0

Vous souhaitez donc que l'événement soit déclenché à partir d'un autre thread? Le code suivant ferait juste cela.

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

Une fois que le thread principal atteindra _autoResetEvent.WaitOne(), il sera bloqué jusqu'à ce que l'objet Event soit signalé. Si l'objet AutoResetEvent n'est jamais signalé, le thread qui attend sur WaitOne() bloquera indéfiniment (en supposant que personne ne lance InterruptException sur le thread principal et aucune valeur de délai n'a été transmise à la méthode WaitOne()).

Questions connexes