我想写个多线程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。主程序有个现成的数组,里面有N(比如10000)个servername(string),遍历这个数组,针对每个不同的server name, 开一个线程,然后调用一次公共方法
public String GetDataFromServer(string servertname) { ...}
并获得一个返回值。2. 我想最多只能开100个子线程,为头100个servername服务。当正在运行的子线程数达到上限100,主程序等待,直道空闲线程的出现
3. 只要任意一个子线程执行GetDataFromServer结束,该线程可以继续为下一个(比如第101个)servername服务。
4。直到遍历完这个数组,所有子线程操作全部结束,主程序退出。
这对有过多线程编程经验的朋友来说,应该小菜一碟。
有急用,非常感谢!
比如 index 101 的string 被访问的时候 其他线程来了的话只能访问 index102地方的string 不能访问101 .
lock{...读取数组返回给你的工作线程...index++别忘记}
就可以保障数组访问不会出现危险并且效率没问题
{
//...
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;
如果你一定要有100个线程,就用new Thread ...。
你这个WaitOne和set恐怕无法达到预期效果.