异步方式访问网页
时间:2022-04-23
本文章向大家介绍异步方式访问网页,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
采用BackgroundWorker,在后台执行程序,往往比开新线程更简单和更加安全。
简单的使用方法
System.ComponentModel.BackgroundWorker bw = new System.ComponentModel.BackgroundWorker();
//定义需要在子线程中干的事情
bw.DoWork += new System.ComponentModel.DoWorkEventHandler(bw_DoWork);
//定义执行完毕后需要做的事情
bw.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
//开始执行 bw.RunWorkerAsync();
static void bw_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Complete"+Thread.CurrentThread.ManagedThreadId.ToString());
}
static void bw_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
MessageBox.Show(Thread.CurrentThread.ManagedThreadId);
}
我改写了一个通知页面处理的方法,不需要结果,通知了主程序就继续前进,保证效率
/// <summary>
/// 访问网页(异步方式),只需激活网页,不要结果
/// </summary>
/// <param name="url">网页地址</param>
/// <returns></returns>
public static void Notify(string url)
{
BackgroundWorker bw = new BackgroundWorker(); //定义一个背景对象
//定义需要在子线程中干的事情
bw.DoWork += new System.ComponentModel.DoWorkEventHandler(bw_DoWork);
bw.RunWorkerAsync(url);
}
/// <summary>
/// 后台执行:打开网页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void bw_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
string url = (string)e.Argument;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
string content = "";
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK) //防止无响应
{
StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("GB2312"));
content = reader.ReadToEnd();
reader.Close();
}
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType).Debug("异步方式打开网页:" + url+",返回长度:"+content.Length.ToString());
}
catch (Exception ex)
{
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType).Error("[Notify]打开网页" + url + "出错:" + ex.Message);
}
}
执行效果不错,这是跟踪的情况:
可以看到,假如同时发生多个访问的话,系统会分配不同的线程执行(前面的是线程号)。
- Vagrant share浅析
- 空间金字塔池化(Spatial Pyramid Pooling, SPP)原理和代码实现(Pytorch)
- 批量下载Coursera及其他场景上的文件
- 深度学习动手入门:GitHub上四个超棒的TensorFlow开源项目
- [产品与技术] Flight data recorder
- [技术与产品] Bower & Brunch
- 计算机视觉识别简史:从 AlexNet、ResNet 到 Mask RCNN
- [技术产品] 用node-webkit做桌面应用
- [技术] 谈谈Python
- [技术] 谈谈编程思想
- DeepLearning.ai学习笔记(五)序列模型 -- week1 循环序列模型
- 黑客马拉松
- python select模块详解
- 轮询、长轮询、长连接、websocket
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Golang glog使用详解
- kubernetes使用securityContext和sysctl
- 浅谈分词算法基于字的分词方法(HMM)
- 优雅的重启服务
- Go defer 会有性能损耗,尽量不要用?
- 带入gRPC:分布式链路追踪 gRPC + Opentracing + Zipkin
- 聊聊Golang逃逸分析
- 结构型设计模式:适配器模式和门面模式
- 结构型设计模式:代理模式
- kubernete中的原子调度单位:pod
- mybatis-generator在命令行及IEAD中的使用
- mybatis-generator在命令行及IDEA中的使用
- 70-STM32+ESP8266+AIR202基本控制篇-移植使用-移植单片机MQTT底层包到自己的工程项目
- springboot研究:springboot自带监控actuator
- springboot研究:springboot使用swagger自动构建api