1. FileDownLoad.cs
本次测试使用HttpClient从网站下载图片并保存到本地,在FileDownLoad类中提供DownLoadInBackGround接口,供外部调用,封装具体的下载操作。
using System;
using System.Diagnostics;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
namespace CSProject
{
public delegate void DownLoadMethodInvoker(bool ret, string URL, string fullfilename);
//处理下载回调,后期可以作为下载接口的外部参数,提供给外部调用者处理下载后的操作
public class FileDownLoad
{
private static string PATH = "E:/VSWorkspace/CSharp/CSProject/CSProject/Data/Images/";//本地地址
private static FileDownLoad instance = null;
private static HttpClient httpClient = null;
private static HttpClientHandler httpClientHandler = null;
public static FileDownLoad Instance
{
get
{
if(instance == null)
{
instance = new FileDownLoad();
//设置相关的参数
httpClientHandler = new HttpClientHandler()
{
MaxConnectionsPerServer = 10,
MaxAutomaticRedirections = 10,
};
httpClient = new HttpClient(httpClientHandler)
{
Timeout = TimeSpan.FromSeconds(10),
};
}
return instance;
}
}
//下载接口,供外部调用
public void DownLoadInBackGround(string URL, string filename)
{
if (!string.IsNullOrEmpty(URL))
{
Task.Factory.StartNew(async () => await DownLoadAsync(URL, filename, DownLoadCallBack));
}
}
//Callback也可以设置为DownLoadInBackGround接口的参数,直接使用调用者的Callback
private void DownLoadCallBack(bool ret, string URL, string fullfilename)
{
if (!ret)
{
Console.WriteLine("Download result = " + ret);
Console.WriteLine($"URL = {URL},LocalPath = {fullfilename}");
return;
}
}
private async Task DownLoadAsync(string URL, string filename, DownLoadMethodInvoker callback)
{
Console.WriteLine("URL = " + URL);
try
{
using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, URL))
{
using (HttpResponseMessage response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
{
long? contentLength = 0;
if ((int)response.StatusCode >= 400 && (int)response.StatusCode < 600)
{
Console.WriteLine("Error statuscode = " + response.StatusCode);
return;
}
try
{
response.EnsureSuccessStatusCode();
contentLength = response.Content.Headers.ContentLength;
Console.WriteLine("ContentLength = " + response?.Content?.Headers?.ContentLength);
int bufferSize = contentLength > 0 ? (int)contentLength : 1024 * 100;//默认100KB以下
byte[] buffer = new byte[bufferSize + 1024 * 2];//添加2KB冗余空间
buffer = await response.Content.ReadAsByteArrayAsync();
//将读取到的内容写进本地文件
using (FileStream fileStream = new FileStream(PATH + filename, FileMode.Create))
{
Console.WriteLine("Read file complete, filesize = " + bufferSize);
fileStream.Write(buffer, 0, bufferSize);
Console.WriteLine("Write End, URL = " + URL);
}
callback?.Invoke(true, URL, PATH + filename);
}
catch (Exception ex)
{
Console.WriteLine("exception = " + ex.Message);
callback?.Invoke(false, URL, PATH + filename);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("Exception = " + ex.Message);
callback?.Invoke(false, URL, PATH + filename);
}
}
}
}
2. FileDownLoadTC.cs
编写测试类FileDownLoadTC,提供测试方法,并调用之前实现的下载接口
using System;
namespace CSProject
{
public class FileDownLoadTC
{
private static FileDownLoadTC instance;
public static FileDownLoadTC Instance
{
get
{
if(instance == null)
{
instance = new FileDownLoadTC();
}
return instance;
}
}
public void Test()
{
//图片位置:https://img.infinitynewtab.com/wallpaper/
for (int i = 1; i <= 300; i++)
{
string URL = "https://img.infinitynewtab.com/wallpaper/" + i + ".jpg";
FileDownLoad.Instance.DownLoadInBackGround(URL, i.ToString("D3") + ".jpg");
}
}
}
}
3. Program.cs
调用测试方法
using System;
namespace CSProject
{
internal class Program
{
static void Main(string[] args)
{
FileDownLoadTC.Instance.Test();
Console.ReadLine();
}
}
}
千百度
© 版权声明
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
THE END
暂无评论内容