Последовательный .NET Parallel For's - Блокировка после каждого - PullRequest
5 голосов
/ 01 ноября 2010

У меня есть несколько последовательных операций Parallel.For.

В настоящее время я проверяю каждое возвращаемое значение Parallel.For ParallelLoopResult и сплю в течение 20 миллисекунд, пока элемент IsCompleted не будет установлен в true.*


Dim plr as ParallelLoopResult 

plr = Parallel.For(...)

while not plr.IsCompleted
  Thread.Sleep(20)
end while

plr = Parallel.For(...)

while not plr.IsCompleted
  Thread.Sleep(20)
end while

.
.
.

Как я могу добавить блок уровня ядра (т.е. WaitHandle) вместо цикла и Thread.Sleep?Есть ли событие завершения, которое запускает Parallel.For?Предусматривает ли Parallel.For такой механизм?

Ответы [ 2 ]

4 голосов
/ 01 ноября 2010

Parallel.For завершит весь код, для которого он был вызван. IsCompleted возвращает только false, тогда цикл был прерван.

С http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallelloopresult.aspx:

Если IsCompleted возвращает true, то цикл завершается, так что все итерации цикла были выполнены. Если IsCompleted возвращает false, а LowestBreakItered возвращает значение null, для остановки цикла был использован преждевременный вызов Stop. Если IsCompleted возвращает false, а LowestBreakIteration возвращает ненулевое целое значение, разрыв был использован для преждевременного завершения цикла.

1 голос
/ 01 ноября 2010

Вы не можете получить WaitHandle для Parallel.For(), и вам не нужно - вызов является синхронным (все итерации будут завершены после завершения вызова). Если вам нужно выполнить сам цикл в другом потоке, а не только в итерациях, вы должны заключить его в Task или Thread, и эти объекты предоставят вам дескрипторы ожидания. Но если вы собираетесь ждать результатов в том же потоке, что и при вызове Parallel.For() (как в вашем примере кода), это не имеет никакого смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...