参照asp.net 上的教程《如何:使用 Task.WhenAll 扩展异步演练 (C#)》,使用了async/await以后,感觉怪怪的。
使用nginx作为服务器,对每个连接限制速度50K。 然同时开启了10个任务进行分段下载(HTTP 1.1支持下载文件的指定部分),以500K的速度完成了下载-,最后把10个临时文件合并起来。不过这个年代估计下载速度已经不是瓶颈了。。。。。
用了两种方法保存下载后的内容
1.每个任务生成一个临时文件,最后按顺序合并为目标文件
2.先生成一个和目标文件同大小的空文件,每个任务按对应位置填写空文件,直到所有下载的内容按位置填写完成。
对async这个模型还不了解。 高手勿喷,谢谢!-
环境是vs 、.net core 、 nginx 是一个控制台项目。只用最落后的IE的原始下载工具才会单线程下载(这样才能看到被限制用50K下载速度的效果)…除外基本浏览器下载工具都自带多线程下载了。…
代码都在program.cs里面,非常简单。 其实用的都是framework 的api,基本上只要是.net 的都是通用的。
按上面的方法配置nginx,限制每个连接速度50K。其他http服务器也是可以的,nginx够方便嘛-
单任务的情况下就只能以50K的速度进行下载了
多任务同时下载,总带宽就达到1M了
项目的属性
代码就在下面了
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
namespace HttpDownloader
{
class Program
{
static void Main(string[] args)
{
Httpdownloader1 dl = new Httpdownloader1();
Console.WriteLine("main 线程ID:" + Thread.CurrentThread.ManagedThreadId);
dl.startasync();
Console.ReadKey();
}
}
class Httpdownloader1
{
public string url = "http://192.168.1.19/big.jpg";
const int BUFFER_SIZE = 4096;
const int rangesnum = 20;
Dictionary<string, bool> partfiles = new Dictionary<string, bool>();
ArrayList togethers = new ArrayList();
//目的不用生成临时文件 用于创建一个目标文件同大小,共享写入的filestream
FileStream fsnotemp = null;
static ReaderWriterLockSlim _rw = new ReaderWriterLockSlim();
public void startasync()
{
Console.WriteLine(" startasync 线程ID:" + Thread.CurrentThread.ManagedThreadId);
long x = ProcessContentLengthAsync(url).Result;
Console.WriteLine("通过request的head方法获取文件长度:{0}", x.ToString());
int x1 = AsynchronousProcessing(x, url).Result;
Console.WriteLine("完成分段下载后的总长度:{0}", x1.ToString());
}
private async Task<long> ProcessContentLengthAsync(string url)
{
long length = 0;
var webReq = (HttpWebRequest)WebRequest.Create(url);
webReq.Method