2010-09-15 6 views
0

Une application Windows Phone faisant référence à une DLL (autre projet de bibliothèque de classes). Il y a un serveur de requête asynchrone dans la DLL pour demander un serveur et analyser la réponse.Comment un appel asynchrone communique-t-il à l'interface utilisateur

L'événement de clic d'un bouton dans la page principale de l'application WinPhone appelle la méthode asynchrone de la DLL référencée. La méthode de rappel déclenche un événement lorsque la réponse est reçue et analysée. Maintenant, quand l'événement augmente, j'ai l'objet analysé jusqu'à la couche HTTPcommunication. Simplement comment afficher une boîte de message avec ce résultat dans l'interface utilisateur lorsque le module HTTPcommunication est terminé avec son travail.

public class HTTPRequester 
{ 
    public delegate void ResponseReceievedAndParsedDelegate(HTTPRequester eventRaiser, object result); 
    public event ResponseReceievedAndParsedDelegate ResponseReceivedAndParsed; 

    public void GetUserInformation(string userid) 
    { 

     HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
     request.Credentials = new NetworkCredential("uid", "pwd"); 
     request.Method = "GET"; 
     request.Accept = "application/json"; 
     object data = new object(); 
     RequestState state = new RequestState(request, data); 
     IAsyncResult asr = request.BeginGetResponse(new AsyncCallback(RequesterCallback), state); 


    } 

    void RequesterCallback(IAsyncResult result) 
    { 
     RequestState state = (RequestState)result.AsyncState; 
     WebRequest request = (WebRequest)state.Request; 
     HttpWebResponse response =(HttpWebResponse)request.EndGetResponse(result); 

     Stream s = response.GetResponseStream(); 
     StreamReader readStream = new StreamReader(s); 
     string dataString = readStream.ReadToEnd(); 

     response.Close(); 
     s.Close(); 
     readStream.Close(); 



     HTTPResponseParser grp = new HTTPResponseParser(); 
     UserInfo ui = grp.ParseUserInformation(dataString); 
     state.Response = ui; 

     if (ResponseReceivedAndParsed != null) 
     { 
      ResponseReceivedAndParsed(this, ui); 
     } 
    } 
} 



     (asynchronous) 

MainUI ------> HTTCommunicator ---------> Serveur

MainUI HTTPCommunicator < -------- Serveur

Mon problème est comment rendre le lien manquant pour transmettre la réponse de HTTPCommunicator à l'interface utilisateur principale.

J'espère que je ne vous ai pas confondu les gars. Est-ce que quelqu'un pourrait pointer vers un échantillon de code, si cela peut être fait avec Dispatcher.

Répondre

0

Dans la méthode de cérat UI:

private void HandleMessage(HTTPRequester eventRaiser, object result) 
{ 
    UserInfo ui = (UserInfo)result; 
    //show message 
} 

Après avoir créé HttpRequester joindre à son événement:

HttpRequester xxx = new ... 
xxx.ResponseReceivedAndParsed += new ResponseReceievedAndParsedDelegate(HandleMessage); 
+0

Merci, cela m'a vraiment aidé. – async

+0

Sur une note supplémentaire, Dispatcher.BeginInvoke (() => {MessageBox.Show (((UserInfo) résultat) .FirstName);}); serait utile pour éviter les accès croisés invalides. – async

Questions connexes