2016-06-24 1 views
-2

J'ai un service Web (WSDL) et certaines méthodes async void (je ne peux pas le changer pour retourner la tâche) pour appeler des demandes plus longues.Obtenir la valeur renvoyée par void Méthode asynchrone

Comment puis-je obtenir les valeurs de résultat de cette méthode?

Sur le service Web, j'ai EventHandlers, EventArgs (que j'ai besoin d'utiliser sur le délégué EventHandle). Donc, la question fondamentale est, comment puis-je comprendre toutes ces choses pour obtenir mes résultats?

Je cela, jusqu'à présent:

//Methods signatures 
getSomethingCompletedEventArgs(object[] results, Exception, bool, object userState) 
getSomethingCompletedHandler(object sender, Service.getSomethingCompletedEventArgs) 

//Didn't build 
Service srv = new Service() 
srv.getSomethingCompleted += new getSomethingCompletedEventHandler(srv.getSomethingAsync); 

//Other try 
var args = new getSomethingCompletedEventArgs(null, new Exception(), false, ""); 
//Didn't build too (Method name expected)  
srv.getSomethingCompleted += new getSomethingCompletedEventHandler(args); 


//This built, but I don't know how to get the results 
public async static void GetSomething() 
{ 
    await Task.Run(() => srv.getSomethingAsync(arg1,arg2,arg3)); 
} 
+3

Les méthodes 'void' n'ont pas de valeurs de retour, que pensez-vous pouvoir en obtenir? – DavidG

+0

Sans une plus grande quantité d'informations environnantes sur ce que fait réellement votre application, il est même difficile de comprendre votre question. Lorsque vous effectuez une requête asynchrone, vous devez désigner un "callback" qui finira par recevoir des "événements" indiquant le succès ou l'échec. Dans les différents bits de code ci-dessus marqués "Autre essai" et ainsi de suite, il semble que vous trébucher dans plus ou moins la bonne direction, mais ne l'avez pas encore tout à fait raison, et abandonné beaucoup trop bientôt. –

+0

DavidG, les appels qui * émettent * les requêtes peuvent en effet être correctement "vides", car * ils * ne renvoient pas de valeur. Les valeurs qui peuvent être «retournées» seront fournies, à un moment futur inconnu, lorsque l'un des événements prévus se produira. Les valeurs feront partie des données fournies, avec l'événement, à ces gestionnaires. –

Répondre

0

Donc, je manque une méthode pour mettre en œuvre mon rappel et déléguer.

Service srv = new Service(); 

src.getSomethingCompleted += returnMethod; 

Task.Run(() => srv.getSomethingAsync(arg1, arg2, arg3)); 

private static void returnMethod(object sender, getSomethingCompletedEventArgs e) 
{ 
    var result = e.Result.items.ToList(); 
} 

La méthode de retour est appelée lorsque getSomethingAsync reçoit l'état Completed.