我想写个多线程Console程序,C#。要求:
1。主程序有个现成的数组,里面有N(比如10000)个servername(string),遍历这个数组,针对每个不同的server name, 开一个线程,然后调用一次公共方法
public String GetDataFromServer(string servertname) { ...} 
并获得一个返回值。2. 我想最多只能开100个子线程,为头100个servername服务。当正在运行的子线程数达到上限100,主程序等待,直道空闲线程的出现
3. 只要任意一个子线程执行GetDataFromServer结束,该线程可以继续为下一个(比如第101个)servername服务。
4。直到遍历完这个数组,所有子线程操作全部结束,主程序退出。
这对有过多线程编程经验的朋友来说,应该小菜一碟。
有急用,非常感谢!

解决方案 »

  1.   

    你这个需求只有一个难题. 公共资源访问同步.
    比如 index 101 的string 被访问的时候 其他线程来了的话只能访问 index102地方的string 不能访问101 .
      

  2.   

    但是为了确保效率,你又不能把 这个所谓的 [数组] 给lock.  那这样吧,因为 对数组的读取本身并非阻塞操作.所以即使在读取 数组某个index地方的元素的时候加了lock那么也会立即释放.所以可以以简单又常规的方式lock read过程即可.你只需要写个read方法,方法里附带下面的过程:
    lock{...读取数组返回给你的工作线程...index++别忘记}
    就可以保障数组访问不会出现危险并且效率没问题
      

  3.   

    static void Main(string[] args)
    {
        //...
        for (int i = 0; i < 100; i++)
        {
            ThreadPool.QueueUserWorkItem(Worker);
        }
        jobDone.WaitOne();
    }static void Worker(object state)
    {
        while(true)
        {
            int i = Interlocked.Increment(ref currentAddressIndex);
            if( i >= addresses.Length) break;
            results[i] = GetDataFromServer(addresses[i]);
        }
        jobDone.Set();
    }static string[] addresses = new string[1000];
    static string[] results = new string[1000];
    static ManualResetEvent jobDone = new ManualResetEvent(false);
    static int currentAddressIndex = 0;
      

  4.   

    另外 , 还有 read方法的class请确保只被实例化一次.也就是单例.只有这样才能保障lock的绝对安全性.其他的什么创建 100个线程,循环访问,然后还有线程方法 都不复杂.自己写吧.
      

  5.   

    注:ThreadPool有个(可调整)的线程数量上限。
    如果你一定要有100个线程,就用new Thread ...。
      

  6.   


    你这个WaitOne和set恐怕无法达到预期效果.