线程foreach循环的正确方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程foreach循环的正确方法相关的知识,希望对你有一定的参考价值。
在过去的30分钟里我一直在讨论这个问题,尝试编写一个简单的foreach
循环,无论我做什么都会抛出一些错误(第一次不使用线程框架,所以我很可能会犯一些愚蠢的语法错误)
可悲的是,我不能使用qazxsw poi因为必须留下.net 3.5或以下...有人能告诉我正确的方法这样做,所以我可以回去不想尖叫!
伪代码
Parallel.For
编辑:MonoDevelop正在抛出以下错误
- 表达式表示值,其中期望类型或方法组
- System.Threading.Thread.Thread(System.Threading.ThreadStart)的最佳重载方法匹配有一些无效的参数,
- 参数#1无法将对象表达式转换为System.Threading.ThreadStart类型
答案
首先,对于像这样的东西,你应该使用一个完整线程的较轻重量的ThreadPool intead。 (你也犯了一些转换错误,线程池版本使用与Thread相同的样式,所以你可以看到差异)
void SomeMethod
{
foreach(Touch Input in Inputlist){
Thread thread = new Thread(new ThreadStart(this.FilterInput(Input)));
thread.Start();
}
}
void FilterInput(Input UnFilteredInput){
....
}
但是我仍然担心每秒创建太多线程并且会建议某种阻塞来计算新线程的创建速率。
void SomeMethod
{
foreach(Touch input in Inputlist){
ThreadPool.QueueUserWorkItem(new WaitCallback(FilterInput), input);
}
}
void FilterInput(object unCastUnFilteredInput){
Touch UnFilteredInput = (Touch)unCastUnFilteredInput;
....
}
以上是关于线程foreach循环的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
如何正确调用 Parallel.ForEach 循环中的调用异步方法[重复]
在Javascript中确保forEach / for循环的正确顺序的简单方法?