2016-07-21 1 views
1

J'ai un composant auquel une tâche est assignée à effectuer de manière asynchrone. Quand c'est fait, il déclenchera l'un des deux événements pour indiquer le succès ou l'échec. Je dois convertir tout cela à un appel synchrone:Convertir un appel asynchrone avec des événements en synchrone dans VB.NET

Public Function AssignTask(o As Object) as Boolean 
    Dim component As New X.Y.Z.Component() 
    component.DoSomethingWith(o) 
    AddHandler component.OnSuccess, AddressOf OnSuccess 
    AddHandler component.OnError, AddressOf OnError 

    Return True 'Need to return success or not. 
End Sub 

Private Sub OnSuccess(sender As Object, e As System.EventArgs) 
    'Success! :) 
End Sub 

Private Sub OnError(sender As Object, e As System.EventArgs) 
    'Error! :(
End Sub 

Je suis confus, comme la façon de j'obtenir les événements pour déclencher le succès ou l'échec de la méthode principale.

Merci!

Répondre

1

Vous pourriez faire quelque chose comme ça (ce qui est pas thread-safe, ne sera donc pas bien jouer si vous appelez cela pour différents threads)

Private _completedFlag As Boolean 
Private _completionResult As Boolean 

Public Function AssignTask(o As Object) as Boolean 
    Dim component As New X.Y.Z.Component() 
    _completedFlag = False 
    AddHandler component.OnSuccess, AddressOf OnSuccess 
    AddHandler component.OnError, AddressOf OnError 
    component.DoSomethingWith(o) 
    Do Until _completedFlag 
     'wait 
    Loop 
    Return _completionResult 
End Sub 

Private Sub OnSuccess(sender As Object, e As System.EventArgs) 
    _completionResult = True 
    _completedFlag = True 
End Sub 

Private Sub OnError(sender As Object, e As System.EventArgs) 
    _completionResult = False 
    _completedFlag = True 
End Sub 

J'ai déplacé le AddHandler pour avant d'appeler réellement la méthode , car il est possible qu'il se termine avant que le gestionnaire est attaché

+0

Merci! Solution soignée et simple. – Manolis