2013-11-07 2 views
2

Я занимаюсь этим в течение последних 30 минут, пытаясь натолкнуть простой цикл foreach, который меняет какую-то ошибку, независимо от того, что я делаю (Первый раз, когда я не использую структуру потоков, поэтому я «м, скорее всего, сделать какие-то глупые синтаксическую ошибку)Правильный способ Thread a foreach loop

к сожалению, я не могу использовать 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.T hread.Thread (System.Threading.ThreadStart) имеет некоторые недопустимые аргументы,

  3. Аргумент # 1 не может преобразовать выражение объекта к типу System.Threading.ThreadStart

+0

Попробуйте добавить 'Touch Copy = Input;' строка в верхней части петли и изменения начало нити на 'Thread нить = новый Thread (новый ThreadStart (this.FilterInput (копия)));' –

+0

Все еще выполняются те же 3 ошибки, даже с этим :: '(выражение обозначает значение, в котором ожидался тип или группа методов) (наилучшее соответствие перегруженного метода для System.Threading.Thread.Thread (System.Threading.ThreadStart) некоторые недопустимые аргументы), (3: Аргумент # 1 не может преобразовать выражение объекта в тип System.Threading.ThreadStart). – Burdock

+0

ошибки отбрасывания в сторону, скорее всего, вы создадите слишком много потоков, если не поместите Семафор в цикле или что-то в этом роде. –

ответ

4

Прежде всего, для чего-то вроде это вы должны использовать более легкий вес ThreadPool для полного потока. (Кроме того, вы делали некоторые литейные ошибки тоже, версия пула потоков использует один и тот же стиль, как тему, так что вы можете увидеть разницу)

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