2009-10-06 4 views
3

Comment pouvez-vous bloquer jusqu'à la fin d'un événement asynchrone?Blocage jusqu'à la fin d'un événement

est ici un moyen de bloquer jusqu'à ce que l'événement est appelé en mettant un drapeau dans le gestionnaire d'événements et vote le drapeau:

private object DoAsynchronousCallSynchronously() 
{ 
    int completed = 0; 
    AsynchronousObject obj = new AsynchronousObject(); 
    obj.OnCompletedCallback += delegate { Interlocked.Increment(ref completed); }; 
    obj.StartWork(); 

    // Busy loop 
    while (completed == 0) 
     Thread.Sleep(50); 

    // StartWork() has completed at this point. 
    return obj.Result; 
} 

Est-il possible de le faire sans vote?

Répondre

5
private object DoAsynchronousCallSynchronously() 
    { 
     AutoResetEvent are = new AutoResetEvent(false); 
     AsynchronousObject obj = new AsynchronousObject();  
     obj.OnCompletedCallback += delegate 
     { 
      are.Set(); 
     };  
     obj.StartWork();  

     are.WaitOne(); 
     // StartWork() has completed at this point.  
     return obj.Result; 
    } 
3

N'utilisez-vous pas une opération asynchrone? Le point derrière les opérations asynchrones n'est PAS de bloquer le thread appelant.

Si vous souhaitez bloquer le thread appelant jusqu'à la fin de votre opération, utilisez une opération synchrone.

+0

La bonne réponse. +1 – spender

+2

À moins que l'API/l'objet n'expose pas un appel synchrone (en fait, je travaille avec un appel qui ne l'est pas). – ctacke

+0

Dans le plus simple des termes, vous avez peut-être raison, mais que se passe-t-il si vous voulez effectuer l'opération asynchrone X fois et bloquer l'appelant jusqu'à ce que tous les X soient terminés? Si c'est ce que le PO essaie de me demander, je reformulerais probablement la question, mais quand je lis la question, c'est la première chose qui me saute aux yeux. – Joseph

Questions connexes