Асинхронный вызов C # .Net вопрос начинающих - PullRequest
0 голосов
/ 15 сентября 2010

Итак, я получил некоторую помощь от некоторых веб-уроков и выполнения асинхронного вызова. Я хочу вернуть объект типа UserInfo из следующего асинхронного вызова. Но я не уверен, как программа протекает после запроса. BeginResponse (). Это что-то вроде дополнительного параметра ref типа UserInfo, который можно передать в метод обратного вызова?

        UserInfo GetUserInfoAsync()
        {
        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
        request.Credentials = new NetworkCredential("myID", "myPWD");
        request.Method = "GET";
        request.Accept = "application/json";

        object data = new object();
        RequestState state = new RequestState(request, data, url);
        IAsyncResult asr = request.BeginGetResponse(new AsyncCallback(myCallback), state);
        return null; //Need guidence here;
        }

        private static void myCallback(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();
        UserInfo ui = ParseJSON(dataString );
        }

Ответы [ 3 ]

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

Ваш метод GetUserInfoAsync вернется до завершения запроса.Вот что значит быть асинхронным.Вы должны заставить ваш обратный вызов предпринять соответствующие действия с UserInfo, который он только что получил - например, обратный вызов в потоке пользовательского интерфейса (используя Dispatcher) для обновления пользовательского интерфейса.

Вы могли бы заставьте ваш GetUserInfo звонить подождать, пока он не получит результат - но вы в принципе не должны.Весь смысл асинхронных вызовов - избежать блокировки.

0 голосов
/ 15 сентября 2010
return null; //Need guidence here;

Вы не можете вернуть что-либо значимое в этот момент. Используйте событие из обратного вызова, чтобы уведомить, что результат готов.

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

Вам необходимо обработать данные в вашем обратном вызове. Если вам нужно вернуть информацию о пользователе из вашего первоначального вызова метода, вам нужна синхронная операция. До завершения операции невозможно получить эту информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...