[C# 多线程处理系列专题八——对多线程的补充
2013-06-01 18:41
309 查看
因为有些人可能会疑惑,将了这么多多线程,到底在实际的应用上有什么作用的呢? 这里我在这里用多线程简单实现了一个文件的下载的功能。
服务器端页面:
<%@ 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>服务器页面只是一个简单显示需要下载文件的一些信息,这里通过Handler.ashx来处理文件的下载,把文件的转化为二进制字节写入到输出流中,具体实现代码为:
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进行解析的,实现原理我还是清楚,但是在做的过程中还是出现了问题。所以这里只能分享一个简单的下载文件的功能给大家了,
至于多线程的下载和断点续传和大文件的上传等问题,等我学习了再和大家分享, 如果有大牛可以帮助我解决服务端断点续传的问题的话,欢迎留言。
源文件下载链接:http://files.cnblogs.com/zhili/FileServer.zip (下载下来后只需要在服务器端Resources文件夹下添加一个文件就可以运行了)
服务器端页面:
<%@ 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>服务器页面只是一个简单显示需要下载文件的一些信息,这里通过Handler.ashx来处理文件的下载,把文件的转化为二进制字节写入到输出流中,具体实现代码为:
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进行解析的,实现原理我还是清楚,但是在做的过程中还是出现了问题。所以这里只能分享一个简单的下载文件的功能给大家了,
至于多线程的下载和断点续传和大文件的上传等问题,等我学习了再和大家分享, 如果有大牛可以帮助我解决服务端断点续传的问题的话,欢迎留言。
源文件下载链接:http://files.cnblogs.com/zhili/FileServer.zip (下载下来后只需要在服务器端Resources文件夹下添加一个文件就可以运行了)
相关文章推荐
- [C# 多线程处理系列专题八——对多线程的补充
- [C# 多线程处理系列专题七——对多线程的补充
- [.Net 多线程处理系列专题七——对多线程的补充
- [.Net 多线程处理系列专题七――对多线程的补充
- [.Net 多线程处理系列专题七——对多线程的补充
- [.Net 多线程处理系列专题七——对多线程的补充
- [.Net 多线程处理系列]专题七:——对多线程的补充
- [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
- [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
- [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
- 【C#网络编程系列】专题七:UDP编程补充——UDP广播程序的实现
- [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
- [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
- [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
- [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
- C#多线程学习(五) 多线程的自动管理(定时器) (转载系列)——继续搜索引擎研究
- 【面向对象语言系列】关于 C# 多线程编程,你需要知道的事
- [C# 网络编程系列]专题八:P2P编程
- [C# 网络编程系列]专题八:P2P编程
- [C#]网络编程系列专题二:HTTP协议详解