2

在过去的 30 分钟里,我一直在研究这个问题,试图线程化一个简单的foreach循环,无论我做什么都会抛出一些错误(第一次不使用线程框架,所以我很可能会犯一些愚蠢的语法错误

可悲的是,Parallel.For由于必须保持 .net 3.5 或更低版本,我无法使用...有人可以告诉我正确的方法,这样我就可以回到不想尖叫的状态!!

须藤代码

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 类型

4

1 回答 1

4

首先,对于这样的事情,您应该使用重量更轻的线程池而不是完整的线程。(你也确实犯了一些铸造错误,线程池版本使用与 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();
    }
}
于 2013-11-07T06:35:56.970 回答