一个简单的利用 HttpClient 异步下载的示例
可能你还会喜欢 一个简单的利用 WebClient 异步下载的示例 ,且代码更加新。
1. 定义自己的 HttpClient 类。
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Web; namespace WindowsFormsApplication1.Codes
{
public class SkyHttpClient
{
HttpClient client; public string BaseURL { get; } public SkyHttpClient()
:this(string.Empty)
{ } public SkyHttpClient(string baseUrl)
{
this.BaseURL = baseUrl;
InitializeClient();
} public async Task<byte[]> DownloadImage(string url)
{
return await client.GetByteArrayAsync(url);
} void InitializeClient()
{
client = new HttpClient();
if (!string.IsNullOrEmpty(BaseURL))
{
client.BaseAddress = new Uri(BaseURL);
client.DefaultRequestHeaders.Add("Referer", BaseURL);
client.DefaultRequestHeaders.Add("Origin", BaseURL);
}
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"); //client.DefaultRequestHeaders.Add("Accept", "application/json");
}
}
}
2. 完成核心下载方法。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace WindowsFormsApplication1.Codes
{
public static class TaskDemo101
{
public static async Task<bool> RunCore(int id)
{
SkyHttpClient skyHttpClient = new SkyHttpClient(); string url1 = "http://www.xxx.me/Uploads/image/20130129/2013012920080761761.jpg";
string url2 = "http://www.xxx.me/Uploads/image/20121222/20121222230686278627.jpg";
string url3 = "http://www.xxx.me/Uploads/image/20120606/20120606222018461846.jpg";
string url4 = "http://www.xxx.me/Uploads/image/20121205/20121205224383848384.jpg";
string url5 = "http://www.xxx.me/Uploads/image/20121205/20121205224251845184.jpg"; string resultUrl;
int randomNum = new Random().Next(, );
switch (randomNum)
{
case : resultUrl = url1; break;
case : resultUrl = url2; break;
case : resultUrl = url3; break;
case : resultUrl = url4; break;
case : resultUrl = url5; break;
default: throw new Exception("");
}
var task = skyHttpClient.DownloadImage(resultUrl);
return await task.ContinueWith<bool>(t => {
var data = t.Result;
string targetFolderDestination = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "downloads\\images\\");
try
{
Directory.CreateDirectory(targetFolderDestination);
}
catch (Exception)
{
Console.WriteLine("创建文件夹失败!");
return false;
}
string targetFileDestination = Path.Combine(targetFolderDestination, string.Format("img_{0}.png", DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss")));
File.WriteAllBytes(targetFileDestination, data);
return true;
});
}
}
}
3. 制作 UI
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private async void button1_Click(object sender, EventArgs e)
{
try
{
List<int> ids = new List<int>();
for (int i = ; i <= ; i++)
{
ids.Add(i);
}
this.listBoxLog.Items.Insert(, string.Format("当前时间:{0},准备开始下载...", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
foreach (var id in ids)
{
bool result = await TaskDemo101.RunCore(id);
this.listBoxLog.Items.Insert(, string.Format("当前时间:{0},编号 {1} 下载 {2}!", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), id, result));
}
this.listBoxLog.Items.Insert(, string.Format("当前时间:{0},下载完毕!", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Download Error!");
}
}
}
4. 运行截图

5. 疑问
最后,需要注意的是我们的 SkyHttpClient 是每次下载一个图片都会创建一个,那这种每次创建销毁是否会有性能影响呢?在单线程的环境下,我们能否通过外部传入 SkyHttpClient 呢?
比如如下:

6. 最后
参考了文章 https://www.oschina.net/news/77036/httpclient ,发现 HttpClient 建议不要每次都创建新的,而尽量要 static 全局变量缓存,但多线程下也许不安全,所以需要注意最好一个线程使用一个 HttpClient。
还有这篇文章:https://www.cnblogs.com/MingQiu/p/7728443.html
谢谢浏览!
一个简单的利用 HttpClient 异步下载的示例的更多相关文章
- 一个简单的利用 WebClient 异步下载的示例(一)
继上一篇文章 一个简单的利用 HttpClient 异步下载的示例 ,我们知道不管是 HttpClient,还算 WebClient,都不建议每次调用都 new HttpClient,或 new We ...
- 一个简单的利用 WebClient 异步下载的示例(三)
继续上一篇 一个简单的利用 WebClient 异步下载的示例(二) 后,继续优化它. 1. 直接贴代码了: DownloadEntry: public class DownloadEntry { p ...
- 一个简单的利用 WebClient 异步下载的示例(二)
继上一篇 一个简单的利用 WebClient 异步下载的示例(一) 后,我想把核心的处理提取出来,成 SkyWebClient,如下: 1. SkyWebClient 该构造函数中 downloadC ...
- 一个简单的利用 WebClient 异步下载的示例(五)(完结篇)
接着上一篇,我们继续来优化.我们的 SkyParallelWebClient 可否支持切换“同步下载模式”和“异步下载模式”呢,好处是大量的代码不用改,只需要调用 skyParallelWebClie ...
- 一个简单的利用 WebClient 异步下载的示例(四)
接上一篇,我们继续优化它. 1. DownloadEntry 类 public class DownloadEntry { public string Url { get; set; } public ...
- VC6下OpenGL 开发环境的构建外加一个简单的二维网络棋盘绘制示例
一.安装GLUT 工具包 GLUT 不是OpenGL 所必须的,但它会给我们的学习带来一定的方便,推荐安装. Windows 环境下的GLUT 本地下载地址:glut-install.zip(大小约为 ...
- 一个简单的AXIS远程调用Web Service示例
我们通常都将编写好的Web Service发布在Tomcat或者其他应用服务器上,然后通过浏览器调用该Web Service,返回规范的XML文件.但是如果我们不通过浏览器调用,而是通过客户端程序调用 ...
- 利用VisualStudio单元测试框架举一个简单的单元测试例子
本随笔很简单,不涉及mock和stub对象,而是只给出一个简单的利用Visual Studio单元测试框架的最简单例子.如果需要深入理解Unit Test的原理与艺术,请参考<The art o ...
- 用Verilog语言实现一个简单的MII模块
项目中要求简单地测试一下基于FPGA的模拟平台的RJ45网口,也就是需要实现一个MII或者RMII模块.看了一下官方网口PHY芯片的官方文档,还是感觉上手有点障碍,想在网络上找些参考代码看看,最后只在 ...
随机推荐
- .NET同一个页面父容器与子容器通信方案
主界面: 关键主页面代码: <div id="EditDiv"> <iframe src="javascript:void(0)" id=&q ...
- windows7系统 执行应用程序报 Error accessing specified device (Error: 2)
--------------------------- ---------------------------Error accessing specified device (Error: 2) - ...
- 尝试在iOS上使用gRPC
简介 gRPC,google的远程过程调用框架,传输协议使用 HTTP2, 序列化协议使用 protobuf.gRPC 使用 HTTP2 传输协议传输 protobuf 序列化的二进制数据,有极高的效 ...
- 搞NDK开发
1.哪些场景下要用到NDK开发? 跨平台的库,如FFmpeg, skip,weex, 加固,防逆向 签名校验 图片压缩 音视频解码 OpenGL ES 高级特效 热修复 andfix 人脸识别 fac ...
- 软件工程个人作业(wc.exe项目)
一.项目Github地址 https://github.com/huangzihaohzh/WordCounter 二.PSP表格 PSP2.1 Personal Software Process S ...
- 章节十一、6-操作集合里面的Web元素
以下演示操作以该网站为例:https://learn.letskodeit.com/p/practice 一.如何操作多个元素(把多个元素放到集合容器中然后操作它们) 列如我们需要操作这些单选框:: ...
- Flink使用SideOutPut替换Split实现分流
以前的数据分析项目(版本1.4.2),对从Kafka读取的原始数据流,调用split接口实现分流. 新项目决定使用Flink 1.7.2,使用split接口进行分流的时候,发现接口被标记为deprac ...
- Mongodb基础 学习小结
MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能 ...
- 三层架构介绍和MVC设计模型介绍
springmvc是什么? Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层 进行职责解耦,基于请 ...
- 【视频技术】EasyDarwin