相信大家都有用过网际快车等下载资源的经历,它里面是可以设置线程数的(近年版本默认是10,曾经默认是5)。它会将文件分成与线程数相同的部分,然后每个线程下载自己的那一部分,这样下载效率就有可能提高。相信大家都有加多线程数,提升下载效率的经历。但细心的用户会发现,在带宽一定的情况下,并不是线程越多,速度越快,而是在某一点达到峰值。
在C#中用多线程并不难实现。它有一个命名空间:System.Threading,提供了多线程的支持。
  

要开启一个新线程,须要以下的初始化:

            

ThreadStart startDownload = new ThreadStart( DownLoad );

//线程起始设置:即每个线程都执行DownLoad(),注意:DownLoad()必须为不带有参数的方法

Thread downloadThread = new Thread( startDownload ); //实例化要开启的新类

downloadThread.Start();//开启线程

由于线程起始时启动的方法不能带有参数,这就为多线程共享资源添加了麻烦。不过我们可以用类级变量(当然也可以使用其它方法,笔者以为此方法最简单易用)来解决这个问题。知道开启多线程下载的方法后,大家可能会发生几个疑问:

1.如何操纵线程的数量?

2.如何防止多线程下载同一网页?

3.如何判断线程结束?

4.如何操纵线程结束?

下面就这几个问题提出解决方法:

1.线程数量我们可以通过for循环来实现,就如同当年初学编程的打点程序一样。

譬如已知用户指定了n(它是一个int型变量)个线程吧,可以用如下方法开启五个线程。

            

Thread[] downloadThread;

//声名下载线程,这是C#的优势,即数组初始化时,不需要指定其长度,可以在使用时才指定。

这个声名应为类级,这样也就为其它方法控件它们提供了可能

ThreadStart startDownload = new ThreadStart( DownLoad );

//线程起始设置:即每个线程都执行DownLoad()

downloadThread = new Thread[ n ];//为线程申请资源,确定线程总数

for( int i = 0; i < n; i++ )//开启指定数量的线程数

{

downloadThread[i] = new Thread( startDownload );//指定线程起始设置

downloadThread[i].Start();//逐个开启线程

}

好了,实现控制开启线程数是不是很简单啊?

2.下面出现的一个问题:所有的线程都调用DonwLoad()方法,这样如何避免它们同时下载同一个网页呢?

这个问题也好解决,只要树立一下Url地址表,表中的每个地址只容许被一个线程申请即可。具体实现:

可以利用数据库,树立一个表,表中有四列,其中一列专门用于存储Url地址,另外两列分别存放地址对应的线程以及该地址被申请的次数,最后一列存放下载的内容。(当然,对应线程一列不是必要的)。当有线程申请后,将对应线程一列设定为当前线程编号,并将是否申请过一列设置为申请一次,这样,别的线程就无法申请该页。要是下载成功,则将内容存入内容列。要是不成功,内容列仍为空,作为是否再次下载的依据之一,如果反复不成功,则进程将于达到重试次数(对应当地址被申请的次数,用户可设)后,申请下一个Url地址。好了,这样就解决了多线程中,线程冲突。当然,去重问题也可以在C#语言内解决,只根建立一个临时文件(文本就可以),保存所有的Url地址,差对它们设置相应的属性即可,但查找效率可能不及数据库快。

3.线程结束是很难判断的,因为它总是在查找新的链接。用者认为可以假设:线程重复N次以后还是没有能申请到新的Url地址,那么可以觉得它已经下载完了所有链接。主要代码如下:

            

string url = "";

int times = 0;

while ( url == "" )//要是没有找到符合条件的记录,则不断地寻觅符合条件的记录

{

url = getUrl.GetAUrl( …… );//调用GetAUrl方法,试图得到一个url值

if ( url == "" )//要是没有找到

{

times ++;//尝试次数自增

continue; //进行下一次尝试

}

if ( times > N ) //要是已经尝试够了次数,则退出进程

{

downloadThread[i].Abort; //退出进程

}

else//如果没有尝试够次数

{

Times = 0; //尝试次数归零处理

}

//进行下一步针对得到的Url的处理

}

4.这个问题相对简单,因为在问题一中已经提议,将线程声名为类级数组,这样就很易于操纵。只要用一个for循环即可结束。代码如下:

            

for( int i = 0; i < n; i++ )//关闭指定数量n的线程数

{

downloadThread[i].Abort();//逐个关闭线程

}

好了,一个多线程的C#程序就这样完成了,在C#面前,它的实现本来如此简单。

转载于:https://www.cnblogs.com/jordan2009/archive/2009/12/21/1628572.html

c#实现多线程代码例子相关推荐

  1. python实用程序育儿法_Python多线程 简明例子

    Python多线程 简明例子 (2010-03-11 15:15:09) Python多线程 简明例子 综述 多线程是程序设计中的一个重要方面,尤其是在服务器Deamon程序方面.无论何种系统,线程调 ...

  2. fread读结构体返回值是0无错误_嵌入式C编程之错误处理(附代码例子)!

    原标题:嵌入式C编程之错误处理(附代码例子)! 作者: clover-toeic 前言 本文主要总结嵌入式系统C语言编程中,主要的错误处理方式.文中涉及的代码运行环境如下: 一.错误概念 错误分类 从 ...

  3. 用Java测试多线程代码

    测试多线程代码是一个艰巨的挑战. 尝试测试并发性时获得的第一个建议是尽可能地在代码中隔离并发问题. 这是一般的设计建议,但在这种情况下甚至更重要. 确保首先正确地对并发构造所包装的逻辑进行单元测试. ...

  4. Eclipse调试多线程代码

    Eclipse调试多线程代码 标签: eclipse 调试 多线程 | 发表时间:2013-02-16 05:51 | 作者:czjuttsw 分享到: 出处:http://blog.csdn.net ...

  5. ios代码大全】代码例子区全区搜索索引

    /************************ ************************    IOS 类代码 ************************/ 我自己做的翻书效果,小猫 ...

  6. 多线程代码,性能怎么优化!

    Java 中最烦人的,就是多线程,一不小心,代码写的比单线程还慢,这就让人非常尴尬. 通常情况下,我们会使用 ThreadLocal 实现线程封闭,比如避免 SimpleDateFormat 在并发环 ...

  7. 【很强大的ios代码大全】代码例子区全区搜索索引

    ************************    IOS 类代码 ************************/ 我自己做的翻书效果,小猫咪再次登场「2011/03/02」 如何实现QQLi ...

  8. 30 个 php 操作 redis 常用方法代码例子

    这篇文章主要介绍了 30 个 php 操作 redis 常用方法代码例子 , 本文其实不止 30 个方法 , 可以操作 string 类 型. list 类型和 set 类型的数据 , 需要的朋友可以 ...

  9. spring cloud微服务治理eureka、hystrix、zuul代码例子

    spring cloud微服务中台服务代码例子,包括eureka.hystrix.zuul https://github.com/birdstudiocn/spring-cloud-sample/tr ...

最新文章

  1. 关闭tomact被占用的进程
  2. 【codeforces 765F】 Souvenirs
  3. 调用Xvid编码器流程(基于xvid1.1.0)
  4. Spring Boot实践——基础和常用配置
  5. node.js 实现扫码二维码登录
  6. 牛客16785 Cantor表
  7. c++ map 函数
  8. 5 高可靠,构建RabbitMQ集群架构
  9. 你以为PHP那么好自定义升级?
  10. 1032. 挖掘机技术哪家强(20)-PAT乙级真题
  11. 谷歌拼音输入法快速切换中英文解决中英文混合打字问题
  12. 关于Net Core 多平台程序的Framework问题
  13. SQL数据库基础练习题及答案
  14. 下行文格式图片_下行文格式图片_写信封的正确格式图片 看完这些你就懂了
  15. java得到几天前的日期
  16. Java — 慎用Executors类中newFixedThreadPool()和newCachedThreadPool()
  17. 跟i9处理器差不多的服务器芯片,AMD下一代服务器处理器代号“星河舰队”
  18. 零基础C语言入门001——编译器下载
  19. 菩提树下都是宝,大家学习要趁早,不懂多问为什么,这种态度才算好
  20. https实现原理(SSL认证过程)

热门文章

  1. les物流执行系统_物流规划工作如何开展?
  2. python程序填空程序改错_Python - class dummyclass(object): 改错
  3. ssh 连接_怎样解决Linux环境下远程连接ssh速度慢的问题
  4. 008_表内容的插入删除修改
  5. Pycharm连接git服务器的方法
  6. oracle 作业 断开原因,解惑 | Oracle JOB 异常中断原因分析
  7. python宏替换_#和##在宏替换中的作用
  8. ue4加载本地版本_【虚幻4】创建本地数据库
  9. python入门基础代码初学
  10. 进程间通信的方式(三):消息队列