2010-01-25 5 views
0

à ne pas bloquer l'interface utilisateur de mes applications quand il y a une longue opération que j'utilise pour faire:Comment prendre le résultat d'une méthode appelée de manière asynchrone?

Public Sub ButtonHandler() handles Button 
    Dim auxDelegate as Action 

    auxDelegate = New Action(AddressOf DoAction) 
    auxDelegate.BeginInvoke(AddressOf EndAction,Nothing) 
End Sub 

Private Sub DoAction() 
    ''# Do long time operations here 
End Sub 

Private Sub EndAction() 
    ''# Update results here 
End Sub 

est-il un moyen de prendre le résultat de doAction dans le cas où il est une fonction au lieu d'un sous et utiliser ce résultat à EndAction autre que définir un attribut de classe et mettre la valeur là?

Par exemple, si doAction est comme ceci:

Private Function DoAction() As Boolean 
    return True 
End Sub 

Il y a une façon de prendre le résultat de doAction à endaction?

Merci d'avance!

Répondre

2

Action est un pointeur vers une fonction qui ne prend aucun argument et ne renvoie aucune valeur. Si vous souhaitez que votre fonction renvoie une valeur, vous devez utiliser un autre délégué. Par exemple, vous pouvez utiliser Func(Of Boolean) si vous voulez que votre fonction renvoie une valeur booléenne:

Dim auxDelegate As Func(Of Boolean) 

Public Sub ButtonHandler() handles Button 
    auxDelegate = AddressOf DoAction 
    auxDelegate.BeginInvoke(AddressOf EndAction, Nothing) 
End Sub 

Private Function DoAction() As Boolean 
    Return True 
End Function 

Private Sub EndAction(ByVal ar As IAsyncResult) 
    ' call EndInvoke on the delegate to obtain the result 
    Dim result As Boolean = auxDelegate.EndInvoke(ar) 
End Sub 
+0

Merci! Tu as raison, c'est juste ce que je cherchais! –

Questions connexes