可能你还会喜欢 一个简单的利用 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 异步下载的示例的更多相关文章

  1. 一个简单的利用 WebClient 异步下载的示例(一)

    继上一篇文章 一个简单的利用 HttpClient 异步下载的示例 ,我们知道不管是 HttpClient,还算 WebClient,都不建议每次调用都 new HttpClient,或 new We ...

  2. 一个简单的利用 WebClient 异步下载的示例(三)

    继续上一篇 一个简单的利用 WebClient 异步下载的示例(二) 后,继续优化它. 1. 直接贴代码了: DownloadEntry: public class DownloadEntry { p ...

  3. 一个简单的利用 WebClient 异步下载的示例(二)

    继上一篇 一个简单的利用 WebClient 异步下载的示例(一) 后,我想把核心的处理提取出来,成 SkyWebClient,如下: 1. SkyWebClient 该构造函数中 downloadC ...

  4. 一个简单的利用 WebClient 异步下载的示例(五)(完结篇)

    接着上一篇,我们继续来优化.我们的 SkyParallelWebClient 可否支持切换“同步下载模式”和“异步下载模式”呢,好处是大量的代码不用改,只需要调用 skyParallelWebClie ...

  5. 一个简单的利用 WebClient 异步下载的示例(四)

    接上一篇,我们继续优化它. 1. DownloadEntry 类 public class DownloadEntry { public string Url { get; set; } public ...

  6. VC6下OpenGL 开发环境的构建外加一个简单的二维网络棋盘绘制示例

    一.安装GLUT 工具包 GLUT 不是OpenGL 所必须的,但它会给我们的学习带来一定的方便,推荐安装. Windows 环境下的GLUT 本地下载地址:glut-install.zip(大小约为 ...

  7. 一个简单的AXIS远程调用Web Service示例

    我们通常都将编写好的Web Service发布在Tomcat或者其他应用服务器上,然后通过浏览器调用该Web Service,返回规范的XML文件.但是如果我们不通过浏览器调用,而是通过客户端程序调用 ...

  8. 利用VisualStudio单元测试框架举一个简单的单元测试例子

    本随笔很简单,不涉及mock和stub对象,而是只给出一个简单的利用Visual Studio单元测试框架的最简单例子.如果需要深入理解Unit Test的原理与艺术,请参考<The art o ...

  9. 用Verilog语言实现一个简单的MII模块

    项目中要求简单地测试一下基于FPGA的模拟平台的RJ45网口,也就是需要实现一个MII或者RMII模块.看了一下官方网口PHY芯片的官方文档,还是感觉上手有点障碍,想在网络上找些参考代码看看,最后只在 ...

随机推荐

  1. 跨域问题 Blocked a frame with origin "http://......" from accessing a cross-origin frame.

    为了轻松偷懒,不想从目的项目中开发目标项目中的页面,但目的项目中需要获取老项目中的页面,这里用了iframe跨域链接页面出现了问题 Blocked a frame with origin " ...

  2. 微信小程序 自定义头部导航栏和导航栏背景图片 navigationStyle

    ​ 这两天因为要做一个带背景的小程序头,哭了,小程序导航栏有背景也就算了,还得让导航栏上的背景顺下来,心态小崩.现在可以单独设置一个页面的小程序头了,但是前提是要微信7.0以上的版本,考虑到兼容性问题 ...

  3. Scrum 冲刺第五篇

    我们是这次稳了队,队员分别是温治乾.莫少政.黄思扬.余泽端.江海灵 一.会议 1.1  29号站立式会议照片: 1.2  昨天已完成的事情 团队成员 昨日计划完成的工作: 黄思扬 活动管理模块(前端) ...

  4. 队列(Quene)

    对multiprocessing中的Quene进行演示 import multiprocessing """ 队列Quene是mutiprocessing 中 的一个类 ...

  5. 关于重学Linux的随笔

    毕业已有半年, 现在想想真的后悔, 大学没有认真学Linux, 导致现在Linux操作抓瞎, 连服务器都搭不起来. 下定决心重学Linux, 不追求能比上大佬, 但是要熟练, 常用命令要熟悉. 作为一 ...

  6. 代码审计-sha()函数比较绕过

    <?php $flag = "flag"; if (isset($_GET['name']) and isset($_GET['password'])) { var_dump ...

  7. sikuli 搜索例子

    #coding:utf-8kw = input(u"请输入您要搜索的关键字:")#openAPP('‪C:\Users\ceshi\AppData\Local\Google\Chr ...

  8. day20_7.24 面向对象1

    一.面向对象概念 面向对象是一种编程思想,是实现代码高内聚低耦合的关键概念,核心是对象,程序就是由多个对象组成,程序员调度这些对象进行工作. 而与之相对的是面向过程的编程. 优点:逻辑清晰 , 复杂问 ...

  9. 怎么在虚拟机下的Linux系统安装数据库

    1.查看 linux下是否有老版本的mysql(有删除) 查找old mysql:rpm -qa | grep mysql 卸载:卸载命令:rpm –ev {包名}——:rpm -ev mysql-c ...

  10. koa中的路由

    原生路由 网站一般都有多个页面.通过ctx.request.path可以获取用户请求的路径,由此实现简单的路由. const main = ctx => { if (ctx.request.pa ...