.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[];
在具体需要请求服务器的地方创建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, , , 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 > )
{
lstBuffer.AddRange(buffers);
responseStream.BeginRead(buffers, , , 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);
}
}
.Net WebRequest异步请求与WebClient异步请求的更多相关文章
- 普通B/S架构模式同步请求与AJAX异步请求区别(个人理解)
在上次面试的时候有被问到过AJAX同步与异步之间的概念问题,之前没有涉及到异步与同步的知识,所以特意脑补了一下,不是很全面... 同步请求流程:提交请求(POST/GET表单相似的提交操作)---服务 ...
- iOS 网络与多线程--5.异步Post方式的网络请求(非阻塞)
通过Post请求方式,异步获取网络数据,异步请求不会阻塞主线程,而会建立一个新的线程来操作. 代码如下 ViewController.h文件 #import <UIKit/UIKit.h> ...
- iOS 网络与多线程--3.异步Get方式的网络请求(非阻塞)
通过Get请求方式,异步获取网络数据,异步请求不会阻塞主线程(用户界面不会卡死),而会建立一个新的线程. 代码如下 ViewController.h文件 // // ViewController.h ...
- Ajax异步请求XMLHttpRequest对象Get请求
$(function () { $("#btnGetDate").click(function () { var xhr; //第一步:创建异步请求的核心的对象: if (XMLH ...
- 第三节:总结.Net下后端的几种请求方式(WebClient、WebRequest、HttpClient)
一. 前言 前端调用有Form表单提交,ajax提交,ajax一般是用Jquery的简化写法,在这里不再过多介绍: 后端调用大约有这些:WebCient.WebRequest.Httpclient.W ...
- 设计一个方法injectBeforeAsyncSend,能够实现如下功能:在发起异步请求之前打印出请求的类型、URL、method、body、timestamp 等信息。
异步请求逻辑注入 工作中我们需要对异步请求的请求信息打印日志,但是又不能耦合在业务代码中打印.请设计一个方法injectBeforeAsyncSend,能够实现如下功能:在发起异步请求之前打印出请求的 ...
- js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)
js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...
- javascript 异步请求封装成同步请求
此方法是异步请求封装成同步请求,加上token验证,环境试用微信小程序,可以修改文件中的ajax,进行封装自己的,比如用axios等 成功码采用标准的 200 到 300 和304 ,需要可以自行修改 ...
- java判断请求是否ajax异步请求
java判断请求是否ajax异步请求 解决方法: if (request.getHeader("x-requested-with") != null && re ...
随机推荐
- redis源码学习-dict
1.字典相关的几个结构体 dict由hash table存储key-value, hash table数组每一个元素存放dictEntry链接的链表头结点,dictEntry节点存放key-value ...
- Vue + Element UI 实现权限管理系统 前端篇(三):工具模块封装
封装 axios 模块 封装背景 使用axios发起一个请求是比较简单的事情,但是axios没有进行封装复用,项目越来越大,会引起越来越多的代码冗余,让代码变得越来越难维护.所以我们在这里先对 axi ...
- PTA (Advanced Level) 1007 Maximum Subsequence Sum
Maximum Subsequence Sum Given a sequence of K integers { N1, N2, ..., NK }. A continuous su ...
- Oracle存储过程编译卡死的解决方法
转自: https://www.cnblogs.com/liang-ling/p/5395249.html 解决方法如下: 1:查V$DB_OBJECT_CACHE SELECT * FROM V$D ...
- Code First, Database First, Same Time区别
Code First, Database First, Same Time是我理解的asp.net mvc中用到的三种model与数据库对应的方式,肯定是不全面的,理解也有些狭隘,今后随着自己的理解加 ...
- MongoDB的“not master and slaveok=false”错误解决
在客户端操作MongoDB时经常会如下错误: SECONDARY> show collections; Fri Jul :: uncaught exception: error: { } 原因是 ...
- BFS算法(——模板习题与总结)
首先需要说明的是BFS算法(广度优先算法)本质上也是枚举思想的一种体现,本身效率不是很高,当数据规模很小的时候还是可以一试的.其次很多人可能有这样的疑问,使用搜索算法的时候,到底选用DFS还是BFS, ...
- core Animation之CAAnimationGroup(动画群组)
可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行 属性解析: animations:用来保存一组动画对象的NSArray 默认情况下,一组动画对象 ...
- zuul超时及重试配置
配置实例 ##timeout config hystrix: command: default: execution: timeout: enabled: true isolation: thread ...
- #if defined 和 #if ! defined 的用法
背景:MFC初学,头文件中有#if !defined(AFX_HELLOMFC_H__706D36F5_2F1B_40AC_8BE9_0BD6A1D7BBDE__INCLUDED_)#define A ...