有一百个网站,单个执行(每个只打开一次),想建10个线程,分别执行打开这100个网站,如果哪个线程空闲了,就由这个线程执行下一个需要打开的网站,后一个线程空闲后,刚执行下面另外一个没有打开过的网站。求方法、思路。。

解决方案 »

  1.   

    LZ什么叫“打开网站”?
    另外,使用什么版本的.Net Framework?在什么环境下?为什么一定要10个线程?能不能浮动?等等……总感觉很奇怪。
    给个PLINQ的方法好了:
    //假设:
    //有一系列地址的集合
    List<string> l = ...;
    //执行“打开网站”的方法为
    void DoWork(string url);
    //只需要执行:
    l.AsParallel().WithDegreeOfParallelism(10).WithExecutionMode(ParallelExecutionMode.ForceParallelism).ForAll(DoWork);不是4.0+的话,需要自行实现线程池以及任务分配工作。
      

  2.   

    谢谢回答,首先,“打开网站”可能是我描述的不准确,应该说是有一百个网址,要打开一百个网址。
    第二是正常的.net环境,第三10个不一定是固定的,可以改成5个,或者其它数字。还有PLINQ不是很熟悉,能不能别的方法?
      

  3.   

    我的思路是:你先建立一个类,建立10个线程,将其存入一个泛型(List)中,这个类要包含打开网站的方法,线程的执行状态(打开网站ing,打开结束,空闲..),当然还有新建一个线程。然后这个接口就很好用了,在一个while循环里,不断查找空线程(用linq找),执行打开网站的操作。里面还要处理超时,是事务的回滚,统计差错状态。
    思路比较土鳖,可以参考下!
      

  4.   

    如何:创建限制并发程度的任务计划程序
    4.0下实现类似线程池的TPL方案。
    如何:使用线程池(C# 编程指南)
    使用ThreadPool,可以参考ThreadPool设计自己的线程池
    Code for a simple thread pool in C#
    自行实现线程池的例子,第二个回答。
      

  5.   

    有个很简单的办法,就是用一个int变量就可以解决了:
    首先int i=0,
    然后新建一个保存线程的数组,数组的长度可以按要求设置,
    遍历这个数组,全部开始执行打开网站的方法,方法大致如下:
    while循环,条件是i<需要打开的网址的数组长度,
    “i++;”,
    执行打开网址的方法,网址根据i从数组取,
    执行完while之后将线程全部终止。注意:while内第一步就要执行i++,千万不要放在最后面了。