日期:2014-05-17  浏览次数:20992 次

FOR循环中创建线程池
在for 循环中通过ThreadPool.QueueUserWorkItem创建几个线程去处理任务
问题是:
在循环NEXT每次执行时,本次创建的线程是否已全部结束,如果不是,如何手动结束


Thanks guys

我是业余编程爱好者,问的不专业还请谅解
线程池

------解决方案--------------------
引用:
Quote: 引用:

比如说i从0到5
我用threadPool 调一个函数download(),其实download()结束我是有标志的,(我的理解是,download结束,线程也就结束了)然后在FOR 循环的末尾我会判断是否每个线程的download()结束标志都是TRUE,然后才NEXT,
但这样发现有时候,i=2 时, download()中的某些局部变量的值仍保持着i=1时的值
不知为何

这是多线程编程时一个最容易犯的错误。这说明你的两个线程中的过程共享了相同的变量。通常在编程设计时,你应该为每一个线程复制此变量值得副本,然后传给程序执行。例如
for(var i=0;i<5,i++)
{
   ThreadPool.QueueUserWorkItem(h=>
   {
        call(i);
   });
}    

这显然就是乱的。因为它们共享了i,会造成重复。你需要修改为
for(var i=0;i<5,i++)
{
   var j=i;   
   ThreadPool.QueueUserWorkItem(h=>
   {
        call(j);
   });
}