2017-02-02 2 views
0

Я пытаюсь сначала выполнить код внутри потока и дождаться завершения цикла for перед выполнением кода после цикла for.Код запускается до того, как цикл завершен, пул потоков C#

for (int i = 254; i > 1; i--) 
{ 

    //some code here... 

    WaitCallback func = delegate (object state) 
    { 
     //do something here.... - i want this to finish with the loop first 
    }; 

    ThreadPool.QueueUserWorkItem(func); 

} 

// this code is executed once the for loop has finished 
// however i want it to be done 
// after the thread has finished executing its code and the for loop. 
+0

так что вы хотите охватить 254 темы? – Tigran

+0

да, я хотел бы это сделать .... – Milan

+0

@Tigran. Он использует пул потоков, поэтому на самом деле он не будет использовать 254 потока. Это просто планирование 254 операций, которые должны выполняться пулом потоков, каким образом пул потоков считается наиболее оптимальным, что не будет включать 254 реальных потоков. – Servy

ответ

7

Вы можете использовать TPL в очередь свою работу и вызвать Task.WaitAll сразу после цикла:

Task[] tasks = new Task[254]; 
for (int i = 254; i > 1; i--) 
{ 

    //some code here... 

    Task task = TaskFactory.StartNew(() => 
    { 
     //do something here.... - i want this to finish with the loop first 
    }); 
    tasks[i - 1] = task; 
} 

Task.WaitAll(tasks); 

// do other stuff 

TPL, в конечном счете использовать ThreadPool для выполнения работы.

PS. Я не запускал его или что-то еще, так что может возникнуть ошибка «один за другим» с доступом к массиву, но вы должны получить общую идею этого подхода.

Редактировать

Как eocron упоминались в комментариях, используя Parallel.For также может быть вариантом.

+0

Я дам это раньше. Спасибо за ваши усилия. – Milan

+0

Разве не лучше использовать Parallel.For (...) для этого? – eocron

+0

@eocron Это будет зависеть от типа кода внутри делегата, не так ли? Но да, это определенно другой подход. Добавил это к ответу. – MarcinJuraszek

Смежные вопросы