线程foreach循环的正确方法

时间:2013-11-07 06:24:01

标签: c# multithreading for-loop foreach c#-3.0

我在过去的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正在施放以下错误

  1. 表达式表示类型或方法组所在的值 预期

  2. 最佳重载方法匹配 System.Threading.Thread.Thread(System.Threading.ThreadStart)有 一些无效的论点,

  3. 参数#1无法将对象表达式转换为类型 System.Threading.ThreadStart

1 个答案:

答案 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();
    }
}