2015-05-04 83 views
0
for (long key = 0; key < 5; key++) 
{ 
var processingThread = new Thread(() => Setup(key)); 
processingThread.Start(); 
} 

我想每个键值,但在同一时间对多个窗口执行Setup(key)功能..我如何执行多个线程具有相同的功能,但不同的参数同时

+4

会发生什么?你被[关闭循环变量]咬了(http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful的.aspx)? –

+0

看看[ParameterizedThreadStart(https://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart%28v=vs.110%29.aspx) – Yoav

+2

暂时不100%肯定我明白了什么你正试图实现,我认为Parallel.For可以在这种情况下使用。参见[here](https://msdn.microsoft.com/en-us/library/dd460713(v = vs.110).aspx) ,和[这里](http://stackoverflow.com/questions/12405938/save-time-with-parallel-for-loop)。 –

回答

-1

退房的Parallel.ForEach()Parallel.For()方法。

https://msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx

显式地创建一个新的线程有大的开销,应当避免。只有在有充分理由并且已经考虑使用基于线程池的解决方案(如PTL或类似方法)时才可以这样做。 (如果需要的话和铸造)

-1
for (long key = 0; key < 5; key++) 
{ 
    var processingThread = new Thread(Setup); 
    processingThread.Start(key); 
} 

Setup参数类型必须更改为object

+0

安装程序实际上是一种方法,它接受循环变量作为参数。 –

+0

当然。它的签名大概是“void Setup(long key)”,不是吗?它需要在“无效设置(对象键)”中进行更改。 – MatteoSp

+0

如何启动线程一次,使其循环,并执行每次迭代Thread.sleep(500)? –

-2

如果Parallel.For()不提供的伎俩,你可以通过他们的一个的AutoResetEvent。
呼叫Wait()在所有的代表,然后创建的所有线程调用后Set()
,该系统确实

// THIS ISN'T TESTED AND IS WRITTEN HERE, SO MIND THE SYNTAX, THIS MIGHT NOT COMPILE !! 

AutoResetEvent handle = new AutoResetEvent(true); 

for (long key = 0; key < 5; key++) 
{ 
    var processingThread = new Thread(() => 
     { 
      handle.Wait(); 
      Setup(key) 
     }); 
    processingThread.Start(); 
} 

handle.Set(); 
+0

我在我的智能手机上撰写了这篇文章,而不是在Visual Studio中。我在答案中提到了这一点。总的想法起作用。我把它作为Parallel的替代品。For 如果有人记下。请统计他的理由.. –

0

请留意了这样的事实,你需要用时间for循环中捕捉到的key本地副本,否则线程实际调用Setupkey已经成为价值5。如果您捕获本地副本,则该值不会更改,并且全部按预期工作。

for (long key = 0; key < 5; key++) 
{ 
    var localKey = key; 
    var processingThread = new Thread(() => Setup(localKey)); 
    processingThread.Start(); 
} 
相关问题