Как вызвать один и тот же метод n раз, используя задачи для параллельного запуска в C #? - PullRequest
0 голосов
/ 19 мая 2018

Я хочу вызвать метод, который выполняет трудоемкую работу из разных потоков.

Public void DoSomeWork(int n)
{
  // Time Consuming operation depending on n. 
}

1 - я пытаюсь использовать задачу вместо thread & threadpool.
2 - должно быть не более n потоков, работающих параллельно
3 - пока я пытался использовать 'SemaphoreSlim«Я обнаружил, что он вызывает один и тот же поток, вызывая метод несколько раз, и сталкивается с неуправляемым исключением.

Реализация:

 for (int i = 0; i < SomeNumberList.Count; i++)
        {
            semaphore.Wait();
            Task.Factory.StartNew(() => DoSomeWork(SomeNumberList[i])).ContinueWith(x => semaphore.Release());
        }

Как использовать задачу для вызова DoSomeWork параллельными потоками с помощью задачи и как сделатьобработка ошибок для него?

1 Ответ

0 голосов
/ 19 мая 2018

Parallel.For уже дает вам необходимую сортировку для такого рода задач.

    const int n = 5; // No more than "n threads"
    Parallel.For(0,  SomeNumberList.Count, new ParallelOptions{MaxDegreeOfParallelism = n}, i =>
    {
        DoSomeWork(i);
    }

Существует еще одна перегрузка, которая дает вам ParallelLoopState, если вам нужно обрабатывать исключения или прерывать вызовы на основе того, что происходит водновременные казни.

...