2009-03-11 6 views
3

Comment j'appelle une méthode qui retourne un booléen, mais à l'intérieur de cette méthode pour déterminer la valeur du bool, il appelle un service Web de manière asynchrone?Appel d'une méthode et attente d'une valeur de retour

bool myBool = GetABoolean(5);  

public bool GetABoolean(int id) 
{ 

    bool aBool; 

    client.CallAnAsyncMethod(id); // value is returned in a completed event handler. Need to somehow get that value into aBool. 

    return aBool; // this needs to NOT execute until aBool has a value 

} 

donc ce que j'ai besoin est pour la méthode GetABoolean d'attendre jusqu'à ce que CallAnAsyncMethod a rempli et retourné une valeur avant de retourner le bool retour à la méthode d'appel.

Je ne suis pas sûr comment faire cela. Pouvez-vous simplement appeler la méthode Web de manière synchrone?

+0

C'est tout le POINT d'appeler async - vous ne devez pas attendre le résultat .... Donc si vous voulez le résultat - il suffit de l'appeler de manière synchrone! –

+0

La raison de l'appel asynchrone est-elle hors de votre contrôle? Sinon, Marc est sur le point. Ne pas trop compliqué (voir mon exemple horriblement exagéré pour exactement la raison pourquoi). –

+0

Ceci est pour un port vers Silveright. Sinon mes appels resteraient synchrones et je serais beaucoup plus heureux! – ScottG

Répondre

3

+1

Pas dans Silverlight;) –

9

La plupart des méthodes asynchrones renvoient IAsyncResult.

Si le vôtre le fait, vous pouvez utiliser IAsyncResult.AsyncWaitHandle pour bloquer (IAsyncResult.AsyncWaitHandle.WaitOne) pour bloquer jusqu'à la fin de l'opération.

ie:

 
bool aBool;

IAsyncResult res = client.CallAnAsyncMethod(id); res.AsyncWaitHandle.WaitOne(); // Do something here that computes a valid value for aBool! return aBool;

4

soit appeler la méthode synchrone, ou ajouter un gestionnaire d'événements CallAnAsyncMethodCompleted pour cela, et utilise pour travailler avec la valeur de retour de l'objet e.Result.

2

C'est au moins la troisième fois ces derniers jours que j'ai vu ce genre de question, alors je vais poser quelques questions (la réponse à l'OP est évidente). Pourquoi envisagez-vous d'appeler le service Web de manière asynchrone? Performance? Ne pas bloquer un thread de travail?

Avez-vous vu un exemple qui vous amène à utiliser un appel de service Web asynchrone? Si oui, pourriez-vous poster l'URL de l'exemple?

Merci pour votre temps. Vos réponses à ces questions m'aideront à répondre aux autres.


J'ai ajouté un tag « silverlight » à cette question, et je vous suggère de faire la même chose vous-même à l'avenir, pour les questions Silverlight. Cela crée le contexte que tous les appels "bloquants" doivent être asynchrones.

Maintenant, un expert SilverLight devrait répondre, mais je pense que vous allez à ce sujet dans le mauvais sens. Vous perdez la nature asynchrone de l'appel. Je pense que votre méthode GetABoolean devrait également être asynchrone, et ne devrait pas retourner jusqu'à ce qu'elle ait la réponse.

+0

J'essaye de porter ce code WPF sur Silverlight et j'ai besoin que les appels soient des appels asynchrones – ScottG

+0

Merci pour l'entrée. J'ai beaucoup de code comme ceci où j'ai une méthode qui renvoie une valeur. À l'intérieur de cette méthode, il effectue un appel de service. Auparavant, cet appel était synchrone. Je dois maintenant le rendre asynchrone ... mais j'en ai besoin pour rester dans cette méthode jusqu'à ce que l'appel de service revienne. – ScottG

+0

Encore une fois, "non, vous n'avez pas". Rendre la méthode d'appel asynchrone, et vous n'avez pas à vous asseoir dedans. –

0

S'il y a plus de code entre l'appel à CallAnAsyncMethod et le retour, alors il est possible de le faire de façon asynchrone (bien qu'il s'agisse probablement d'une préoptimisation inutile), sinon synchronisez votre code.

Si vous n'avez aucun contrôle sur une architecture qui vous oblige à faire ce code de manière asynchrone, vous devrez surveiller une variable et faire une boucle pour attendre l'achèvement.

bool myBool; 
bool retrievingMyBool; 
RetrieveABoolean(5);  

public bool RetrieveABoolean(int id) 
{ 
    client.CallAnAsyncMethod(id); // value is returned in a completed event handler. Need to somehow get that value into aBool. 
    retrievingMyBool = true; 
    while (retrievingMyBool) 
    { 
     Thread.Sleep(100); 
    } 
} 

private void completedEventHandler([[parameters go here]]) 
{ 
    // code to handle parameters 
    myBool = // whatever 
    retrievingMyBool = false  
} 

C'est une solution horrible, et vous causer des maux de tête gigantesques à l'avenir, surtout si vous avez besoin du code pour être thread-safe, mais comme un hack, cela pourrait fonctionner.

Questions connexes