为了账号安全,请及时绑定邮箱和手机立即绑定

如何异步使用HttpWebRequest(.NET)?

如何异步使用HttpWebRequest(.NET)?

森林海 2019-07-09 10:32:49
如何异步使用HttpWebRequest(.NET)?如何异步使用HttpWebRequest(.NET,C#)?
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

使用HttpWebRequest.BeginGetResponse()

HttpWebRequest webRequest;void StartWebRequest(){
    webRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest), null);}void FinishWebRequest(IAsyncResult result){
    webRequest.EndGetResponse(result);}

异步操作完成后调用回调函数。你至少得打个电话EndGetResponse()从这个功能。


查看完整回答
反对 回复 2019-07-09
?
慕慕森

TA贡献1856条经验 获得超17个赞

考虑到答案:

HttpWebRequest webRequest;void StartWebRequest(){
    webRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest), null);}void FinishWebRequest(IAsyncResult result){
    webRequest.EndGetResponse(result);}

您可以发送请求指针或类似于以下内容的任何其他对象:

void StartWebRequest(){
    HttpWebRequest webRequest = ...;
    webRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest), webRequest);}void FinishWebRequest(IAsyncResult result){
    HttpWebResponse response = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse;}

问候


查看完整回答
反对 回复 2019-07-09
?
弑天下

TA贡献1818条经验 获得超7个赞

到目前为止,每个人都错了,因为BeginGetResponse()在当前线程上做一些工作。从文献资料:

在此方法成为异步之前,BeginGetResponse方法需要完成一些同步设置任务(例如DNS解析、代理检测和TCP套接字连接)。因此,不应在用户界面(UI)线程上调用此方法,因为在引发错误或该方法成功之前,可能需要相当长的时间(取决于网络设置)来完成初始的同步设置任务。

因此,要正确地做到这一点:

void DoWithResponse(HttpWebRequest request, Action<HttpWebResponse> responseAction){
    Action wrapperAction = () =>
    {
        request.BeginGetResponse(new AsyncCallback((iar) =>
        {
            var response = (HttpWebResponse)((HttpWebRequest)iar.AsyncState).EndGetResponse(iar);
            responseAction(response);
        }), request);
    };
    wrapperAction.BeginInvoke(new AsyncCallback((iar) =>
    {
        var action = (Action)iar.AsyncState;
        action.EndInvoke(iar);
    }), wrapperAction);}

然后,您可以对响应进行所需的操作。例如:

HttpWebRequest request;// init your request...then:DoWithResponse(request, (response) => {
    var body = new StreamReader(response.GetResponseStream()).ReadToEnd();
    Console.Write(body);});


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 1577 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信