Как написать асинхронный метод? - PullRequest
1 голос
/ 02 марта 2011

У меня есть метод, который выполняет Http POST, и, поскольку я использую HttpWebRequest для его выполнения, метод основан на асинхронных вызовах. Так как мне нужен мой метод для возврата кода ответа моего POST Http, я хочу сделать мой метод асинхронным. Как мне это сделать?

Я думал об использовании Dispatcher.

РЕДАКТИРОВАТЬ: Таким образом, базовая структура моего кода выглядит следующим образом:

string response;

string httpPost(){
    HttpWebRequest.BeginGetRequestStream(new AsyncCallback(requestCallback), httpWebRequest);
    return response;
}

void requestCallback(IAsyncResult asyncResult){
     HttpWebRequest.EndGetRequestStream(asyncResult);
     HttpWebRequest.BeginGetResponse(new AsyncCallback(responseCallback), httpWebRequest);
}

void responseCallback(IAsyncResult asyncResult){
     HttpWebResponse webResponse = (HttpWebResponse) HttpWebRequest.EndGetResponse(asyncResult);
     response = webResponse.StatusCode.ToString();
}

Я хочу изменить httpPost () на асинхронный метод.

РЕДАКТИРОВАТЬ2:

public static void httpPost(Action<string> completed)
{        
    HttpWebRequest.BeginGetRequestStream(new AsyncCallback(requestCallback), httpWebRequest);
    completed(HttpEngine.response);
}

1 Ответ

1 голос
/ 02 марта 2011

В WP7 HTTPWebRequest уже будет асинхронным - пример его использования см. В этом коде http://www.rudigrobler.net/blog/wp7-webclient-vs-httpwebrequest

        public void DoThePost(Action<string> onSuccess)
{
     var request = (HttpWebRequest)WebRequest.Create(new Uri("http://www.sherdog.com/rss/news.xml"));
    request.BeginGetResponse(r =>
    {
            var httpRequest = (HttpWebRequest)r.AsyncState;
            var httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(r);

            using (var reader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var response = reader.ReadToEnd();

                Deployment.Current.Dispatcher.BeginInvoke(new Action(() =>
                    {
                        onSuccess(response);
                    }));
            }
    }, request);
}

Вызывается с:

DoPost((responseText) => { responseTextBlock.Text = responseText;});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...