.Net WebRequest异步请求与WebClient异步请求

很多情况下一般会使用同步方式发出请求,直到响应后再做后续的逻辑处理等,但有时候后续的逻辑处理不依赖于请求的结果或者是可以挂起等到响应后再处理,又或者是为了解决UI“假死”的现象,这时可以使用异步请求

使用WebRequest实例中的BeginGetResponse方法异步获取响应结果,其中参数callback是委托类型,state是自定义的对象,state用于保存一些信息,在callback对应的方法中可能需要用到这些信息。

下面用一个例子说明,假设需要请求url,该url对应是一张图片,异步获取后展示到PictureBox中(该例子基于winform的一个窗体中)

winform中定义了存放数据的变量

List<byte> lstBuffer = new List<byte>();
byte[] buffers = new byte[8];

在具体需要请求服务器的地方创建WebRequest实例,并调用BeginGetResponse方法

string url = "http://localhost/1.jpg";
var request = WebRequest.Create(url);
request.BeginGetResponse(RespCallBack, request);
RespCallBack方法如下,此处ar.AsyncState也就是上面调用BeginGetResponse方法中参数state对应的信息,也就是request
private void RespCallBack(IAsyncResult ar)
{
    var request = ar.AsyncState as WebRequest;
    var response = request?.EndGetResponse(ar);
    Stream responseStream = response?.GetResponseStream();
    responseStream?.BeginRead(buffers, 0, 8, ReadCallBack, responseStream);
}

由于是异步,此处读数据也是异步读取,ReadCallBack如下:

private void ReadCallBack(IAsyncResult ar)
{
    using (var responseStream = ar.AsyncState as Stream)
    {
        if (responseStream == null) return;
        var read = responseStream.EndRead(ar);
        if (read > 0)
        {
            lstBuffer.AddRange(buffers);
            responseStream.BeginRead(buffers, 0, 8, ReadCallBack, responseStream);
        }
        else
        {
            lstBuffer.AddRange(buffers);
            Stream s = new MemoryStream(lstBuffer.ToArray());
            pictureBox1.Image = Image.FromStream(s);
            pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
            responseStream.Dispose();
        }
    }
}

每次读一定的字节,填充到指定的容器中(lstBuffer),当数据还没有读取完毕就一直调用responseStream.BeginRead(buffers, 0, 8, ReadCallBack, responseStream);

当读取完毕后,将读取的数据(lstBuffer)转换成图片,赋值给pictureBox。

如果是使用WebClient的方式代码量就少很多,调用DownloadDataAsync方法发起异步请求,注册事件DownloadDataCompleted,当异步请求完成的时候会触发 Wc_DownloadDataCompleted事件,Wc_DownloadDataCompleted事件中DownloadDataCompletedEventArgs类型的参数e包含一些信息,其中e.Result就是请求响应的结果(byte[]类型)

var wc = new WebClient();
wc.DownloadDataAsync(new Uri("http://localhost/1.jpg"));
wc.DownloadDataCompleted += Wc_DownloadDataCompleted;
private void Wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
    using (MemoryStream ms = new MemoryStream(e.Result))
    {
        if (pictureBox1 != null) pictureBox1.Image = Image.FromStream(ms);
    }
}

原文地址:https://www.cnblogs.com/godbell/p/9211300.html

时间: 2024-11-02 09:51:27

.Net WebRequest异步请求与WebClient异步请求的相关文章

Ajax异步请求XMLHttpRequest对象Get请求

$(function () { $("#btnGetDate").click(function () { var xhr; //第一步:创建异步请求的核心的对象: if (XMLHttpRequest) { xhr = new XMLHttpRequest(); //运行:is8,ie9,chrom,ff } else {//ie6 ie5.x xhr = new ActiveXObject("Microsoft.XMLHTTP"); } //第二步:设置请求对象跟

网络请求数据 get请求方式 &nbsp; post请求 协议异步连接服务器 block异步连接服务器

网络请求三部 创建一个请求(添加接口,对接口进行解码,) 设定请求方式(将接口转为NSURL,设置请求[请求地址, 缓存策略, 超时时间],设置请求方式) 连接服务器([同步连接,异步连接]代理连接,block连接) #import "MainViewController.h" @interface MainViewController () @property (retain, nonatomic) IBOutlet UIImageView *ImageWiew; //get请求方法

普通B/S架构模式同步请求与AJAX异步请求区别(个人理解)

在上次面试的时候有被问到过AJAX同步与异步之间的概念问题,之前没有涉及到异步与同步的知识,所以特意脑补了一下,不是很全面... 同步请求流程:提交请求(POST/GET表单相似的提交操作)---服务器对请求进行处理(期间客户端浏览器不能进行其他任何操作)----处理完毕返回数据 异步请求流程:通过事件触发请求(移除/点击事件)---服务器对请求进行处理(期间客户端浏览器可以做发送其他请求,不需要管其他请求是否有处理)---处理完毕返回数据 同步就是你叫我去吃饭,我听到了就和你去吃饭:如果没有听

php异步请求数据(转发请求到别处处理)

代码: /* @desc:模拟get.post.json异步请求数据 @param method 请求类型 get|post|json @param url 请求的url地址,如:群发邮件 @param data 请求数据 */ function sock_send($method,$url,$data=array()){ $url = 'http://'.$url; if(strtolower($method) == 'get'){ $query = http_build_query($dat

javascript 异步请求封装成同步请求

此方法是异步请求封装成同步请求,加上token验证,环境试用微信小程序,可以修改文件中的ajax,进行封装自己的,比如用axios等 成功码采用标准的 200 到 300 和304 ,需要可以自行修改 同步任务接入之后,每个任务会进行token的验证,每个任务之间都是同步请求,包括token /** * 同步流请求 * token验证每个接口 * 柯里化添加同步任务 * resolve返回res,cb * reject 返回res,cb * 通过任务中断测试 * 通过成功失败回调函数测试 * *

使用WebClient异步获取http资源

使用WebClient异步获取http资源: 方式一. public static async Task<string> GetStringAsync() { //System.Console.WriteLine(Thread.CurrentThread.Name + " 是否池化线程:" + Thread.CurrentThread.IsThreadPoolThread); System.Console.WriteLine("GetStringAsync is

AJAX请求和跨域请求详解(原生JS、Jquery)

一.概述 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX = 异步 JavaScript 和 XML,是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面. 本博客实验环境: python:2.7.11 web框架:tonado jquery:2.1.1 二.“伪”AJAX 由于

全局的异常捕获过滤器 区分ajax请求 与浏览器导航请求

建一个类ExceptionAttribute 继承 HandleErrorAttribute 重写OnException 方法 里面代码: //1.0日志记录(文本日志和数据库日志) //拿到日志 Exception exe= filterContext.Exception; //获取当前exe的最详细信息 Exception inexe = exe.InnerException==null ? exe:exe.InnerException; while (inexe.InnerExceptio

iOS中网络请求的使用(GET请求与POST请求)

GET&POST GET和POST是两种最常用的与服务器进行交互的HTTP方法 GET 语意是获取指定URL的资源. 将数据按照variable=value的形式,添加到action所指向的URL后面,并且两者只用“?”连接,各变量之间使用“&”连接. 貌似不安全,因为在传输过程中,数据被放在请求的URL中. 传输的数据量小,这主要是因为受URL长度限制. POST POST的语意说向指定URL的资源添加数据. 将数据放在数据体中,按照变量和值相对应的方式,传递到action所指向URL.