Как асинхронный вызов взаимодействует с пользовательским интерфейсом - PullRequest
0 голосов
/ 15 сентября 2010

Приложение Windows Phone, ссылающееся на dll (другой проект библиотеки классов). В dll существует асинхронный веб-запрос для запроса сервера и анализа ответа.

Событие нажатия кнопки на главной странице приложения WinPhone вызывает асинхронный метод ссылочной библиотеки DLL. Метод обратного вызова вызывает событие, когда ответ получен и проанализирован. Теперь, когда возникает событие, я анализирую объект до уровня HTTPcommunication. Просто, как показать окно сообщения с таким результатом в пользовательском интерфейсе, когда модуль HTTPcommunication завершил свою работу.

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 ---------> Сервер

MainUI HTTPCommunicator <-------- Сервер </p>

Моя проблема заключается в том, как заставить отсутствующую ссылку передать ответ от HTTPCommunicator обратно в главный интерфейс.

Надеюсь, я вас не смутил, ребята. Может ли кто-нибудь указать на пример кода, если это можно сделать с помощью Dispatcher.

1 Ответ

0 голосов
/ 15 сентября 2010

В UI cerate метод:

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

После создания HttpRequester прикрепите к его событию:

HttpRequester xxx = new ...
xxx.ResponseReceivedAndParsed += new ResponseReceievedAndParsedDelegate(HandleMessage);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...