SOS!!! 请问,这个简单的多线程程序该如何写?


我想写个多线程 Console程序,C#。

要求:
1。主程序有个现成的数组,里面有N(比如10000)个servername(string),遍历这个数组,针对每个不同的server name, 开一个线程,然后调用一次公共方法
public String GetDataFromServer(string servertname) { ...} 
并获得一个返回值。

2. 我想 最多只能开100个子线程,为头100个servername服务。当正在运行的子线程数达到上限100,主程序等待,直道空闲线程的出现
3. 只要任意一个子线程执行GetDataFromServer结束,该线程可以继续为下一个(比如第101个)servername服务。
4。直到遍历完这个数组,所有子线程操作全部结束,主程序退出。


这对有过多线程编程经验的朋友来说,应该小菜一碟。
有急用,非常感谢!

10 个解决方案

#1


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

#2


mark

#3


但是为了确保效率,你又不能把 这个所谓的 [数组] 给lock.  

那这样吧,因为 对数组的读取本身并非阻塞操作.所以即使在读取 数组某个index地方的元素的时候加了lock那么也会立即释放.

所以可以以简单又常规的方式lock read过程即可.

你只需要写个read方法,方法里附带下面的过程:
lock{...读取数组返回给你的工作线程...index++别忘记}


就可以保障数组访问不会出现危险并且效率没问题

#4


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;

#5


另外 , 还有 read方法的class请确保只被实例化一次.也就是单例.

只有这样才能保障lock的绝对安全性.

其他的什么创建 100个线程,循环访问,然后还有线程方法 都不复杂.自己写吧.

#6


引用 4 楼 gomoku 的回复:
        ...
        ThreadPool.QueueUserWorkItem(Worker);
        ...

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

#7


记得C#的线程提供一个类,可以设置访问公共的代码的线程数量.

#8


引用 4 楼 gomoku 的回复:
C# code
static void Main(string[] args)
{
    //...
    for (int i = 0; i < 100; i++)
    {
        ThreadPool.QueueUserWorkItem(Worker);
    }
    jobDone.WaitOne();
}

static void Worker(……


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

#9


引用 4 楼 gomoku 的回复:
C# code
static void Main(string[] args)
{
    //...
    for (int i = 0; i < 100; i++)
    {
        ThreadPool.QueueUserWorkItem(Worker);
    }
    jobDone.WaitOne();
}

static void Worker(object st……


哥们,能加上注释吗
我看着费劲啊
3Q

#10


路过,学习了~

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号