开发者

How to write an asynchronous method?

开发者 https://www.devze.com 2023-02-14 15:58 出处:网络
I have a method that performs Http POST, and since I\'m using HttpWebRequest to perform it, the method relies on asynchronous calls. Since I need my method to return the response code of my Http POST,

I have a method that performs Http POST, and since I'm using HttpWebRequest to perform it, the method relies on asynchronous calls. Since I need my method to return the response code of my Http POST, I want to make my method asynchronous. How do I do this?

I was thinking of using Dispatcher.

EDIT: So a basic outline of the structure of my code looks like this:

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();
}

I want to change httpPost() to an asynchronous method.

EDIT2:

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


On WP7, HTTPWebRequest will already be asynchronous - for an example of its use, see this code from 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);
}

Called with:

DoPost((responseText) => { responseTextBlock.Text = responseText;});
0

精彩评论

暂无评论...
验证码 换一张
取 消