多线程下载同一个文件 c# async/await

本文介绍了如何使用C#的async/await特性,配合Task.WhenAll来实现多线程分段下载文件。通过设置nginx服务器限制每个连接速度为50K,同时启动10个任务进行下载,最终合并成完整文件。文中提到了两种保存下载内容的方法,并且指出大部分现代浏览器内置了多线程下载功能。示例代码在Program.cs中,使用.NET Core和Visual Studio环境。
摘要由CSDN通过智能技术生成

参照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 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值