因为有些人可能会疑惑,讲了这么多 多线程,到底在实际的应用上有什么作用的呢? 这里我在这里用多线程简单实现了一个文件的下载的功能。

服务器端页面:

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="FileServer.Default" %>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head runat="server">
  5. <title></title>
  6. </head>
  7. <body>
  8. <form id="form1" runat="server">
  9. <div>
  10. <asp:Image ID="Image1" runat="server" ImageUrl="~/Images/1.gif" />
  11. 说明: CLR Via C#
  12. </div>
  13. </form>
  14. </body>
  15. </html>
服务器页面只是一个简单显示需要下载文件的一些信息,这里通过Handler.ashx来处理文件的下载,把文件的转化为二进制字节写入到输出流中,具体实现代码为: 
  1. public class Handle : IHttpHandler
  2. {
  3. public void Proce***equest(HttpContext context)
  4. {
  5. HttpResponse response = context.Response;
  6. HttpRequest request = context.Request;
  7. FileStream fileStream = null;
  8. byte[] buffer = new Byte[10240];
  9. int length;
  10. // 剩余的字节大小
  11. // 因为这里采取的是每次写入10240字节到输出流中
  12. long readToData;
  13. try
  14. {
  15. string filename = "CLR via CSharp 3rd edition.pdf"; //通过解密得到文件名
  16. string filepath = HttpContext.Current.Server.MapPath("~/") + "Resources/" + filename; //待下载的文件路径
  17. fileStream = new FileStream(filepath, FileMode.Open,FileAccess.Read, FileShare.Read);
  18. readToData = fileStream.Length;
  19. while (readToData > 0)
  20. {
  21. // 实际读取的字节大小
  22. length = fileStream.Read(buffer, 0, buffer.Length);
  23. // 把读取到的字节写入输出流中
  24. response.OutputStream.Write(buffer, 0, length);
  25. response.Flush();
  26. readToData = readToData - length;
  27. }
  28. }
  29. catch (Exception ex)
  30. {
  31. response.Write("Error:" + ex.Message);
  32. }
  33. finally
  34. {
  35. if (fileStream != null)
  36. {
  37. fileStream.Close();
  38. }
  39. response.End();
  40. }
  41. }
  42. public bool IsReusable
  43. {
  44. get
  45. {
  46. return false;
  47. }
  48. }
  49. }
这里牵涉到HttpHandle对象问题,这个对象在Asp.net中是真正处理数据的对象,后面如果有时间也和大家分享下深入理解Asp.net系列,主要是介绍在Asp.net中一些核心对象为我们默默做的一些事情,在这里也不详细介绍HttpHandle对象了, 这个示例中主要通过这个类来对文件的处理,把文件的二进制字节写入到输出流中, 客户端在从输出流中读取字节,然后保存为文件(其实文件也就是“流”)。

客户端:

客户端建立了一个WinForm窗口,通过WebBrower控件(就是在WinForm程序中显示网页的控件)来连接服务器页面,当按下下载按钮后,通过线程池线程来执行下载方法。主要代码为:

  1. public void DownLoad(object state)
  2. {
  3. // 计时对象
  4. Stopwatch sw = Stopwatch.StartNew();
  5. HttpWebRequest request;
  6. HttpWebResponse response;
  7. Stream stream;
  8. // 下载下来的保存的地址
  9. string savepath = "D:\\Download.pdf";
  10. FileStream savestream = new FileStream(savepath, FileMode.OpenOrCreate);
  11. try
  12. {
  13. // 发出请求
  14. request = (HttpWebRequest)HttpWebRequest.Create(url);
  15. // 获得回应对象
  16. response = (HttpWebResponse)request.GetResponse();
  17. // 获得回应流
  18. stream = response.GetResponseStream();
  19. byte[] bytes = new byte[10240];
  20. int readsize;
  21. // 每次都读取10240字节
  22. // 采用的是同步读取方法
  23. // 计算耗费的时间
  24. readsize = stream.Read(bytes, 0, bytes.Length);
  25. while (readsize > 0)
  26. {
  27. savestream.Write(bytes, 0, readsize);
  28. readsize = stream.Read(bytes, 0, bytes.Length);
  29. }
  30. sw.Stop();
  31. MessageBox.Show("下载耗时为:" + sw.Elapsed.ToString(), "提示");
  32. }
  33. catch (Exception ex)
  34. {
  35. MessageBox.Show(ex.Message, "Error");
  36. }
  37. finally
  38. {
  39. savestream.Close();
  40. }
  41. }
这样就利用线程池线程简单完成了客户端下载服务器端文件的功能,并且使用线程池线程这样不会阻塞主线程,从而导致在下载文件时,界面同样可以操作,如果不采用多线程操作的话将会在下载过程导致界面“卡死”现象,这样就会给用户带来不好的用户体验

其实本来还想做复杂点的, 开始想实现的功能,是服务器端断点续传,然后客户端多线程下载的功能的,这个示例中只用到了一个线程池线程来完成下载任务,本来想通过执行多个线程池线程来完成下载任务的, 每个线程只负责一部分的读取工作, 然后把每个线程中读取的字节合并起来就是完整的文件字节了,但是这里遇到一个问题,怎么在服务器端实现续传的功能的, 客户端通过AddRange方法来发出部分读取请求,然后服务器端就要对请求头Range进行解析的,实现原理我还是清楚,但是在做的过程中还是出现了问题。所以这里只能分享一个简单的下载文件的功能给大家了, 至于多线程的下载和断点续传和大文件的上传等问题,等我学习了再和大家分享, 如果有大牛可以帮助我解决服务端断点续传的问题的话,欢迎留言。

[.Net 多线程处理系列专题七——对多线程的补充相关推荐

  1. [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现

    上次因为时间的关系,所以把上一个专题遗留下的一个问题在本专题中和大家分享下,本专题主要介绍下如何实现UDP广播的程序,下面就直接介绍实现过程和代码以及运行的结果. 一.程序实现 UDP广播程序的实现代 ...

  2. NVMe系列专题之二:队列(Queue)管理

    转载链接:https://mp.weixin.qq.com/s?__biz=MzIwNTUxNDgwNg==&mid=2247484355&idx=1&sn=04f0617bf ...

  3. [.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店...

    原文:[.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店 一.前言 在前面专题一中,我已经介绍了我写这系列文章的初衷了.由于dax.net中的DDD框架和Bytear ...

  4. “离散元数值模拟仿真技术与应用”系列专题培训的通知

    各有关单位: 随着我国经济的发展,岩土工程涉及的要求从材料.理论到施工工艺都提出了全方位的系统升级.在岩土工程分析设计中,3DEC和PFC软件快速建模也一直是岩土工作者所关注的问题.3DEC是非连续岩 ...

  5. CADD--Amber分子动力学--Schrodinger薛定谔--Pymol--AutoDock 等系列专题会议

    专题一<计算机辅助药物设计CADD专题>为基础专题,共计4天,采用"理论+实操"模式,详细讲授PDB 数据库使用.蛋白结构分析.同源建模.Autodock分子对接.虚拟 ...

  6. 【隐私计算笔谈】MPC系列专题(十五):三方复制秘密分享

    [隐私计算笔谈]MPC系列专题(十五):三方复制秘密分享 文章目录 [隐私计算笔谈]MPC系列专题(十五):三方复制秘密分享 三方复制秘密分享 [隐私计算笔谈]MPC系列专题(一):安全多方计算应用场 ...

  7. Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务

    Microsoft .Net Remoting系列专题之二 一.远程对象的激活 在Remoting中有三种激活方式,一般的实现是通过RemotingServices类的静态方法来完成.工作过程事实上是 ...

  8. 【Silverlight】Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System)

    [Silverlight]Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System) 目前包括微软必应地图在内的几乎所有在线电子地图(如:Google Maps等)都 ...

  9. Exchange 2013部署系列之(七)配置SSL多域名证书

    Exchange 2013部署系列之(七) 配置SSL多域名证书 前面六篇博客我们详细讲解了Exchange Server 2013的部署和配置,Exchange一些服务,如 Outlook 无处不在 ...

最新文章

  1. 微信人人商城云服务器,微信支付 · 微智人人商城使用文档 · 看云
  2. Linux下MySQL登录报错1045,linux下 root 登录 MySQL 报错的问题
  3. Event handling in Angular
  4. 8s存储最佳方案_MaxiDi, 意大利:自动化物流解决方案
  5. 河南计算机基础知识会考,2011河南事业单位备考计算机基础知识试题(含答案 )...
  6. 【计算机网络】网络层 : RIP 协议 ( 路由选择协议分类 | RIP 协议简介 | 信息交换 | 距离向量算法 | 计算示例 )★
  7. 定位CPU飙升问题点
  8. mkv转换mp4格式,mkv格式转mp4
  9. 高并发之阿里云弹性伸缩的使用记录
  10. 支付宝没有优势了,五大银行宣布今起手机银行转账汇款免收手续费
  11. AI视觉千亿规模市场虚席以待 初创企业看好“算法决定芯片”路径
  12. win10快速打开网络适配器选项
  13. 2012成都之行----幺祖祖
  14. svg 可视化操作_使用SVG和D3可视化浏览指标
  15. 企业群发短信时为什么要找短信平台公司而不是直接找运营商发送
  16. 面试大全 | C语言高级部分总结,2.6万字长文
  17. 算法的时间与空间复杂度介绍
  18. 前馈神经网络【BP神经网络】【newff函数】
  19. Camera ITS测试
  20. 用户盘云存储——百度网盘

热门文章

  1. SpringMvc Intercetor
  2. 《计算机网络》谢希仁第五版考试重点整理
  3. 查看当前机器.net 版本的方法
  4. mysql并发写入性能分析
  5. SQLlite在安卓中的基本详解和简单使用
  6. 静态方法和实例化方法的本质区别
  7. swift5表情键盘项目封装
  8. ios基础考试题1,实现按钮点击改变位置和图片的透明度和动画的使用
  9. 以独占方式锁定此配置文件失败.另一个正在运行_JVM深入解析:运行时数据区+HotSpot+JMM+堆+GC+JVM优化+类加载
  10. python opencv直方图_【python opencv】直方图均衡