for (long key = 0; key < 5; key++)
{
var processingThread = new Thread(() => Setup(key));
processingThread.Start();
}
我想每个键值,但在同一时间对多个窗口执行Setup(key)
功能..我如何执行多个线程具有相同的功能,但不同的参数同时
for (long key = 0; key < 5; key++)
{
var processingThread = new Thread(() => Setup(key));
processingThread.Start();
}
我想每个键值,但在同一时间对多个窗口执行Setup(key)
功能..我如何执行多个线程具有相同的功能,但不同的参数同时
退房的Parallel.ForEach()
和Parallel.For()
方法。
https://msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx
显式地创建一个新的线程有大的开销,应当避免。只有在有充分理由并且已经考虑使用基于线程池的解决方案(如PTL或类似方法)时才可以这样做。 (如果需要的话和铸造)
for (long key = 0; key < 5; key++)
{
var processingThread = new Thread(Setup);
processingThread.Start(key);
}
Setup
参数类型必须更改为object
安装程序实际上是一种方法,它接受循环变量作为参数。 –
当然。它的签名大概是“void Setup(long key)”,不是吗?它需要在“无效设置(对象键)”中进行更改。 – MatteoSp
如何启动线程一次,使其循环,并执行每次迭代Thread.sleep(500)? –
如果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();
我在我的智能手机上撰写了这篇文章,而不是在Visual Studio中。我在答案中提到了这一点。总的想法起作用。我把它作为Parallel的替代品。For 如果有人记下。请统计他的理由.. –
请留意了这样的事实,你需要用时间for
循环中捕捉到的key
本地副本,否则线程实际调用Setup
的key
已经成为价值5
。如果您捕获本地副本,则该值不会更改,并且全部按预期工作。
for (long key = 0; key < 5; key++)
{
var localKey = key;
var processingThread = new Thread(() => Setup(localKey));
processingThread.Start();
}
会发生什么?你被[关闭循环变量]咬了(http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful的.aspx)? –
看看[ParameterizedThreadStart(https://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart%28v=vs.110%29.aspx) – Yoav
暂时不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)。 –