没有合适的资源?快使用搜索试试~ 我知道了~
C#多线程编程 四个显示线程计算结果的函数
2星 需积分: 34 24 下载量 34 浏览量
2010-04-12
12:17:09
上传
评论
收藏 195KB DOC 举报
温馨提示
试读
15页
从属线程需要随时将中间结果先是在主界面上,鉴于控件总是由主执行线程所有,从属线程中对控件的任何调用都需要“封送处理”调用。 封送处理是跨线程边界移动调用的行为,需耗费大量的资源。为使需要发生的封送处理量减到最少,并确保以线程安全方式处理调用, 应使用Control.BeginInvoke或Control.Invoke方法来调用主执行线程上的方法,从而使必须发生的跨线程边界的封送处理量减到最少。
资源推荐
资源详情
资源评论
asp.net 在线考试系统自动交卷
asp.net 做的在线考试系统如何实现考试时间到自动交卷?最好不要 Ajax。就是相当于自动
点击了交卷按钮,或者自动提交表单这样。谢谢啦!
1 在你的页面里加一个 LINKBUTTON,ID="lbtn_Submit" VISIBLE="false"
2 在页面里加一段 JS 代码,每隔一段时间判断一下当前时间,如果时间在交卷区间内就触
发 javascript:__doPostBack('lbtn_Submit','')
3 给 LINKBUTTON 添加单击事件代码,就是你交卷时 SERVER 端要执行的操作。
用 C# 实现 HTTP 协议下的多线程文件传输
作者:董海林出处:VCKBASE 责任编辑:方舟
很多人都有过使用网络蚂蚁或网络快车软件下载互联网文件的经历,这些软件的使用可以大大加速互
联网上文件的传输速度,减少文件传输的时间。这些软件为什么有如此大的魔力呢?其主要原因是这些软
件都采用了多线程下载和断点续传技术。如果我们自己来编写一个类似这样的程序,也能够快速的在互联
网上下载文件,那一定是非常愉快的事情。下面我就讲一讲如何利用 C#语言编写一个支持多线程下载文
件的程序,你会看到利用 C#语言编写网络应程序是多么的容易,从中也能体会到 C#语言中强大的网络功
能。
首先介绍一下 HTTP
协议 ,HTTP 亦即 Hpyer Text Transfer Protocal 的缩写,它是现代互联网上最重要
的一种网络协议,超文本传输协议位于 TCP/IP 协议的应用层,是一个面向无连接、简单、快速的 C/S 结
构的协议。HTTP 的工作过程大体上分连接、请求、响应和断开连接四个步骤。C#语言对 HTTP
协议 提供
了良好的支持,在.NET
类库中提供了 WebRequest 和 WebResponse 类,这两个类都包含在 System.Net 命名
空间中,利用这两个类可以实现很多高级的网络功能,本文中多线程文件下载就是利用这两个类实现的。
WebRequest 和 WebResponse 都是抽象基类,因此在程序中不能直接作为对象使用,必须被继承,实际使
用中,可根据 URI 参数中的 URI 前缀选用它们合适的子类,对于 HTTP 这类 URI,HttpWebRequest 和
HttpWebResponse 类可以用于处理客户程序同 WEB 服务器之间的 HTTP 通讯。
HttpWebRequest 类实现了很多通过 HTTP 访问 WEB 服务器上文件的高级功能。HttpWebRequest 类对
WebRequest 中定义的属性和方法提供支持,HttpWebRequest 将发送到 Internet 资源的公共 HTTP 标头的值
公开为属性,由方法或系统设置,常用的由属性或方法设置的 HTTP 标头为:接受, 由 Accept 属性设置, 连
接, 由 Connection 属性和 KeepAlive 属性设置, Content-Length, 由 ContentLength 属性设置, Content-Type, 由
ContentType 属性设置, 范围, 由 AddRange 方法设置. 实际使用中是将标头信息正确设置后,传递到 WEB 服
务器,WEB 服务器根据要求作出回应。
HttpWebResponse 类继承自 WebResponse 类,专门处理从 WEB 服务器返回的 HTTP
响应,这个类实
现了很多方法,具有很多属性,可以全面处理接收到的互联网信息。在 HttpWebResponse 类中,对于大多
数通用的 HTTP 标头字段,都有独立的属性与其对应,程序员可以通过这些属性方便的访问位于 HTTP 接
收报文标头字段中的信息,本例中用到的 HttpWebResponse 类属性为:ContentLength 既接收内容的长度。
有了以上的了解后,下面看看这两个类的用法,要创建 HttpWebRequest 对象,不要直接使用
HttpWebRequest 的构造函数,而要使用 WebRequest.Create 方法初始化一个 HttpWebRequest 实例,如:
HttpWebRequest hwr=(HttpWebRequest)WebRequest.Create(http://www.163.com/);
创建了这个对象后,就可以通过 HttpWebRequest 属性,设置很多 HTTP 标头字段的内容,如
hwr.AddRange(100,1000);设置接收对象的范围为 100-1000 字节。
HttpWebReques 对象使用 GetResponse()方法时,会返回一个 HttpWebResponse 对象,为提出 HTTP 返
回报文信息,需要使用 HttpWebResponse 的 GetResponseStream()方法,该方法返回一个 Stream 对象,可以
读取 HTTP 返回的报文,如:首先定义一个 Strean 对象 public System.IO.Stream ns; 然后
ns=hwr.GetResponse ().GetResponseStream ();即可创建 Stream 对象。有了以上的准备知识后下面开始设计
我们的多线程互联网文件的下载程序,首先打开 Visual Studio.Net 集成开发环境,选择“文件”、“新建”、
“项目”,然后选择“Visual C#项目”,在向导右边列表框中选中“Windows 应用程序”,输入项目名称,如本例
为:httpftp,然后选择“确定”按钮,向导自动生成了一个 Windows 应用程序项目。首先打开窗口设计器设计
应用程序窗口,增加如下控件:
一个列表框 listBox1 三个文本标签 label1-label3 三个文本框 textBox1-textBox3 一个开始接收按钮
button1 设计好的窗口如下图:
控件定义代码是:
public System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textBox1
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox textBox3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.TextBox textBox4;
打开 Form1 的代码编辑器,增加如下的命名空间:
using System.Net;//网络功能
using System.IO;//流支持
using System.Threading ;//线程支持
增加如下的程序变量:
public bool[] threadw; //每个线程结束标志
public string[] filenamew;//每个线程接收文件的文件名
public int[] filestartw;//每个线程接收文件的起始位置
public int[] filesizew;//每个线程接收文件的大小
public string strurl;//接受文件的 URL
public bool hb;//文件合并标志
public int thread;//进程数
定义一个 HttpFile 类,用于管理接收线程,其代码如下:
public class HttpFile
{
public Form1 formm;
public int threadh;//线程代号
public string filename;//文件名
public string strUrl;//接收文件的 URL
public FileStream fs;
public HttpWebRequest request;
public System.IO.Stream ns;
public byte[] nbytes;//接收缓冲区
public int nreadsize;//接收字节数
public HttpFile(Form1 form,int thread)//构造方法
{
formm=form;
threadh=thread;
}
~HttpFile()//析构方法
{
formm.Dispose ();
}
public void receive()//接收线程
{
filename=formm.filenamew[threadh];
strUrl=formm.strurl;
ns=null;
nbytes= new byte[512];
nreadsize=0;
formm.listBox1 .Items .Add ("线程"+threadh.ToString ()+"开始接收");
fs=new FileStream (filename,System.IO.FileMode.Create);
try
{
request=(HttpWebRequest)HttpWebRequest.Create (strUrl);
//接收的起始位置及接收的长度
request.AddRange(formm.filestartw [threadh],
formm.filestartw [threadh]+formm.filesizew [threadh]);
ns=request.GetResponse ().GetResponseStream ();//获得接收流
nreadsize=ns.Read (nbytes,0,512);
while (nreadsize>0)
{
fs.Write (nbytes,0,nreadsize);
nreadsize=ns.Read (nbytes,0,512);
formm.listBox1 .Items .Add ("线程"+threadh.ToString ()+"正在接收");
}
剩余14页未读,继续阅读
资源评论
- cljlgj2013-05-01例子有问题啊
zzqsandy
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功