akash_waits Ответов: 1

C# - как запустить 5 задач параллельно


Всем Привет,

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

Task<string> t1 = Task<string>.Factory.StartNew(() => LookUp1(lookUpObj)); //09:28:41.594538
Task<string> t2 = Task<string>.Factory.StartNew(() => LookUp2(lookUpObj)); //09:28:41.593538
Task<string> t3 = Task<string>.Factory.StartNew(() => LookUp3(lookUpObj)); //09:28:41.593538
Task<string> t4 = Task<string>.Factory.StartNew(() => LookUp4(lookUpObj)); //09:28:41.594538
Task<string> t5 = Task<string>.Factory.StartNew(() => LookUp5(lookUpObj)); //09:28:42.621597
Task.WaitAll(t1, t2, t3, t4, t5);


Я вставил несколько операторов журнала, чтобы подтвердить, вызываются ли эти методы параллельно или нет. Первые 4 метода вызываются параллельно с разницей во времени около 100 миллисекунд, но последний (5-й) метод вызывается после полной 1 секунды по сравнению с другими. Я привел пример времени вызова в комментариях выше.

Пожалуйста, дайте мне знать, что я делаю неправильно или есть ли какие-либо ограничения на количество параллельных вызовов или предложите какой-либо способ добиться этого. Заранее спасибо.

Спасибо,
Акаш Кансал.

Что я уже пробовал:

Parallel.Invoke(() => { r1 = Iteration1LookUp(lookUpObj); },
                () => { r2 = Iteration2LookUp(lookUpObj); },
                () => { r3 = Iteration3LookUp(lookUpObj); },
                () => { r4 = Iteration4LookUp1(lookUpObj); },
                () => { r5 = Iteration4LookUp2(lookUpObj); });

Попробовал это сделать, но результат тот же самый.

1 Ответов

Рейтинг:
0

OriginalGriff

Потоковая обработка сложна, потому что она не детерминирована, когда именно выполняется поток и как долго он работает.
"Проблема" заключается в том, что для работы каждого потока требуется ядро: поэтому чем больше ядер у вашего процессора, тем больше потоков он может запускать одновременно. Если у вас есть два ядра, то только два потока могут работать одновременно, четыре ядра, четыре потока и так далее.
Но это не полная картина, потому что не только ваши потоки хотят места на ядре: Windows полна потоков, многие из которых заняты в любой конкретный момент - вызовите Диспетчер задач, и вы сможете увидеть, сколько процессов запущено в данный момент, и получить представление о том, сколько процессора они используют.

Поэтому, когда вы просите пять потоков, это не означает, что вы получите пять задач, работающих параллельно - вы можете, если у вас достаточно ядер, но в реальном мире вы, вероятно, не будете этого делать. И чем больше мониторинга вы ставите там, чтобы узнать, какие потоки работают, тем больше вы влияете на потоки, которые работают, и искажаете картину!