[.Net 多线程处理系列专题七——对多线程的补充
因为有些人可能会疑惑,讲了这么多 多线程,到底在实际的应用上有什么作用的呢? 这里我在这里用多线程简单实现了一个文件的下载的功能。
服务器端页面:
- <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="FileServer.Default" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <title></title>
- </head>
- <body>
- <form id="form1" runat="server">
- <div>
- <asp:Image ID="Image1" runat="server" ImageUrl="~/Images/1.gif" />
- 说明: CLR Via C#
- </div>
- </form>
- </body>
- </html>
- public class Handle : IHttpHandler
- {
- public void Proce***equest(HttpContext context)
- {
- HttpResponse response = context.Response;
- HttpRequest request = context.Request;
- FileStream fileStream = null;
- byte[] buffer = new Byte[10240];
- int length;
- // 剩余的字节大小
- // 因为这里采取的是每次写入10240字节到输出流中
- long readToData;
- try
- {
- string filename = "CLR via CSharp 3rd edition.pdf"; //通过解密得到文件名
- string filepath = HttpContext.Current.Server.MapPath("~/") + "Resources/" + filename; //待下载的文件路径
- fileStream = new FileStream(filepath, FileMode.Open,FileAccess.Read, FileShare.Read);
- readToData = fileStream.Length;
- while (readToData > 0)
- {
- // 实际读取的字节大小
- length = fileStream.Read(buffer, 0, buffer.Length);
- // 把读取到的字节写入输出流中
- response.OutputStream.Write(buffer, 0, length);
- response.Flush();
- readToData = readToData - length;
- }
- }
- catch (Exception ex)
- {
- response.Write("Error:" + ex.Message);
- }
- finally
- {
- if (fileStream != null)
- {
- fileStream.Close();
- }
- response.End();
- }
- }
- public bool IsReusable
- {
- get
- {
- return false;
- }
- }
- }
客户端:
客户端建立了一个WinForm窗口,通过WebBrower控件(就是在WinForm程序中显示网页的控件)来连接服务器页面,当按下下载按钮后,通过线程池线程来执行下载方法。主要代码为:
- public void DownLoad(object state)
- {
- // 计时对象
- Stopwatch sw = Stopwatch.StartNew();
- HttpWebRequest request;
- HttpWebResponse response;
- Stream stream;
- // 下载下来的保存的地址
- string savepath = "D:\\Download.pdf";
- FileStream savestream = new FileStream(savepath, FileMode.OpenOrCreate);
- try
- {
- // 发出请求
- request = (HttpWebRequest)HttpWebRequest.Create(url);
- // 获得回应对象
- response = (HttpWebResponse)request.GetResponse();
- // 获得回应流
- stream = response.GetResponseStream();
- byte[] bytes = new byte[10240];
- int readsize;
- // 每次都读取10240字节
- // 采用的是同步读取方法
- // 计算耗费的时间
- readsize = stream.Read(bytes, 0, bytes.Length);
- while (readsize > 0)
- {
- savestream.Write(bytes, 0, readsize);
- readsize = stream.Read(bytes, 0, bytes.Length);
- }
- sw.Stop();
- MessageBox.Show("下载耗时为:" + sw.Elapsed.ToString(), "提示");
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message, "Error");
- }
- finally
- {
- savestream.Close();
- }
- }
其实本来还想做复杂点的, 开始想实现的功能,是服务器端断点续传,然后客户端多线程下载的功能的,这个示例中只用到了一个线程池线程来完成下载任务,本来想通过执行多个线程池线程来完成下载任务的, 每个线程只负责一部分的读取工作, 然后把每个线程中读取的字节合并起来就是完整的文件字节了,但是这里遇到一个问题,怎么在服务器端实现续传的功能的, 客户端通过AddRange方法来发出部分读取请求,然后服务器端就要对请求头Range进行解析的,实现原理我还是清楚,但是在做的过程中还是出现了问题。所以这里只能分享一个简单的下载文件的功能给大家了, 至于多线程的下载和断点续传和大文件的上传等问题,等我学习了再和大家分享, 如果有大牛可以帮助我解决服务端断点续传的问题的话,欢迎留言。
[.Net 多线程处理系列专题七——对多线程的补充相关推荐
- [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
上次因为时间的关系,所以把上一个专题遗留下的一个问题在本专题中和大家分享下,本专题主要介绍下如何实现UDP广播的程序,下面就直接介绍实现过程和代码以及运行的结果. 一.程序实现 UDP广播程序的实现代 ...
- NVMe系列专题之二:队列(Queue)管理
转载链接:https://mp.weixin.qq.com/s?__biz=MzIwNTUxNDgwNg==&mid=2247484355&idx=1&sn=04f0617bf ...
- [.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店...
原文:[.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店 一.前言 在前面专题一中,我已经介绍了我写这系列文章的初衷了.由于dax.net中的DDD框架和Bytear ...
- “离散元数值模拟仿真技术与应用”系列专题培训的通知
各有关单位: 随着我国经济的发展,岩土工程涉及的要求从材料.理论到施工工艺都提出了全方位的系统升级.在岩土工程分析设计中,3DEC和PFC软件快速建模也一直是岩土工作者所关注的问题.3DEC是非连续岩 ...
- CADD--Amber分子动力学--Schrodinger薛定谔--Pymol--AutoDock 等系列专题会议
专题一<计算机辅助药物设计CADD专题>为基础专题,共计4天,采用"理论+实操"模式,详细讲授PDB 数据库使用.蛋白结构分析.同源建模.Autodock分子对接.虚拟 ...
- 【隐私计算笔谈】MPC系列专题(十五):三方复制秘密分享
[隐私计算笔谈]MPC系列专题(十五):三方复制秘密分享 文章目录 [隐私计算笔谈]MPC系列专题(十五):三方复制秘密分享 三方复制秘密分享 [隐私计算笔谈]MPC系列专题(一):安全多方计算应用场 ...
- Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务
Microsoft .Net Remoting系列专题之二 一.远程对象的激活 在Remoting中有三种激活方式,一般的实现是通过RemotingServices类的静态方法来完成.工作过程事实上是 ...
- 【Silverlight】Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System)
[Silverlight]Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System) 目前包括微软必应地图在内的几乎所有在线电子地图(如:Google Maps等)都 ...
- Exchange 2013部署系列之(七)配置SSL多域名证书
Exchange 2013部署系列之(七) 配置SSL多域名证书 前面六篇博客我们详细讲解了Exchange Server 2013的部署和配置,Exchange一些服务,如 Outlook 无处不在 ...
最新文章
- 微信人人商城云服务器,微信支付 · 微智人人商城使用文档 · 看云
- Linux下MySQL登录报错1045,linux下 root 登录 MySQL 报错的问题
- Event handling in Angular
- 8s存储最佳方案_MaxiDi, 意大利:自动化物流解决方案
- 河南计算机基础知识会考,2011河南事业单位备考计算机基础知识试题(含答案 )...
- 【计算机网络】网络层 : RIP 协议 ( 路由选择协议分类 | RIP 协议简介 | 信息交换 | 距离向量算法 | 计算示例 )★
- 定位CPU飙升问题点
- mkv转换mp4格式,mkv格式转mp4
- 高并发之阿里云弹性伸缩的使用记录
- 支付宝没有优势了,五大银行宣布今起手机银行转账汇款免收手续费
- AI视觉千亿规模市场虚席以待 初创企业看好“算法决定芯片”路径
- win10快速打开网络适配器选项
- 2012成都之行----幺祖祖
- svg 可视化操作_使用SVG和D3可视化浏览指标
- 企业群发短信时为什么要找短信平台公司而不是直接找运营商发送
- 面试大全 | C语言高级部分总结,2.6万字长文
- 算法的时间与空间复杂度介绍
- 前馈神经网络【BP神经网络】【newff函数】
- Camera ITS测试
- 用户盘云存储——百度网盘
热门文章
- SpringMvc Intercetor
- 《计算机网络》谢希仁第五版考试重点整理
- 查看当前机器.net 版本的方法
- mysql并发写入性能分析
- SQLlite在安卓中的基本详解和简单使用
- 静态方法和实例化方法的本质区别
- swift5表情键盘项目封装
- ios基础考试题1,实现按钮点击改变位置和图片的透明度和动画的使用
- 以独占方式锁定此配置文件失败.另一个正在运行_JVM深入解析:运行时数据区+HotSpot+JMM+堆+GC+JVM优化+类加载
- python opencv直方图_【python opencv】直方图均衡