我在过去的30分钟里一直在讨论这个问题,尝试编写一个简单的foreach
循环,无论我做什么都会产生一些错误(第一次不使用线程框架所以我'最有可能犯了一些愚蠢的语法错误)
可悲的是,我不能使用Parallel.For
,因为必须留下.net 3.5或更低......有人能告诉我正确的方法这样做,所以我可以回去不想尖叫!!
Sudo代码
void SomeMethod
{
foreach(Touch Input in Inputlist){
Thread thread = new Thread(new ThreadStart(this.FilterInput(Input)));
thread.Start();
}
}
void FilterInput(Input UnFilteredInput){
....
}
编辑:MonoDevelop正在施放以下错误
表达式表示类型或方法组所在的值 预期
最佳重载方法匹配 System.Threading.Thread.Thread(System.Threading.ThreadStart)有 一些无效的论点,
参数#1无法将对象表达式转换为类型 System.Threading.ThreadStart
答案 0 :(得分:4)
首先,对于像这样的东西,你应该使用一个较轻的ThreadPool intead一个完整的线程。 (你也犯了一些转换错误,线程池版本使用与Thread相同的样式,所以你可以看到差异)
void SomeMethod
{
foreach(Touch input in Inputlist){
ThreadPool.QueueUserWorkItem(new WaitCallback(FilterInput), input);
}
}
void FilterInput(object unCastUnFilteredInput){
Touch UnFilteredInput = (Touch)unCastUnFilteredInput;
....
}
但是我仍然担心每秒创建太多线程,并会建议某种阻塞来计算新线程的创建速度。
const int MaxConcurrentThreads = 4;
private readonly Semaphore _inputLimiter = new Semaphore(MaxConcurrentThreads,MaxConcurrentThreads);
void SomeMethod
{
foreach(Touch input in Inputlist){
_inputLimiter.WaitOne();
ThreadPool.QueueUserWorkItem(new WaitCallback(FilterInput), input);
}
}
void FilterInput(object unCastUnFilteredInput){
try
{
Touch UnFilteredInput = (Touch)unCastUnFilteredInput;
....
{
finally
{
//use a try-finally so the semaphore still gets released in the event a exception happens in the .... region.
_inputLimiter.Release();
}
}