Я понимаю, что в новом TPL (Task Parallel Library) реализован Parallel.ForEach (), так что он работает с «выраженным параллелизмом». Это означает, что это не гарантирует, что ваши делегаты будут работать в нескольких потоках, а скорее он проверяет, имеет ли платформа хоста несколько ядер, и, если это правда, только тогда он распределяет работу по ядрам (по сути, 1 поток на ядро) .
Если хост-система не имеет нескольких ядер (становится все труднее и труднее найти такой компьютер), то она будет запускать ваш код последовательно, как в «обычном» цикле foreach. Довольно круто, откровенно говоря.
Обычно я бы сделал что-то вроде следующего, чтобы поместить мою длительную операцию в фоновый поток из ThreadPool:
ThreadPool.QueueUserWorkItem (new WaitCallback (targetMethod), new Object2PassIn ());
В ситуация, когда на главном компьютере есть только одно ядро, Parallel.ForEach () TPL автоматически размещает вызов в фоновом потоке? Или мне следует вручную вызывать любые вызовы TPL из фоновой thead, чтобы, если я выполняю с одноядерного компьютера, по крайней мере, эта логика будет отключена от потока диспетчеризации графического интерфейса пользователя?
Меня беспокоит, если я оставлю TPL ответственным. из всего этого я хочу убедиться, что он определяет, что это единственный основной блок, который по-прежнему маршалирует код, находящийся внутри цикла Parallel.ForEach (), в фоновый поток, как это сделал бы я, чтобы не блокировать мой графический интерфейс.
Спасибо за любые мысли или советы, которые могут у вас возникнуть ...