Ваш поток пользовательского интерфейса будет ждать завершения Parallel.For
, прежде чем продолжить.Это означает, что он не может обрабатывать дальнейшие сообщения пользовательского интерфейса до тех пор, пока он не будет завершен.
Теперь, когда рабочие потоки вызывают Invoke
, они ждут, пока поток пользовательского интерфейса не обработает делегат, прежде чем продолжить.Таким образом, они ожидают, что поток пользовательского интерфейса освободится, в основном.
Следовательно, у вас есть тупик - поток пользовательского интерфейса ожидает задачи, которые ожидают поток пользовательского интерфейса ... BeginInvoke
работает, потому что тогда потоки задач не ждут обработки делегатов в потоке пользовательского интерфейса.
Я бы посоветовал вам не вызывать Parallel.For
в потоке пользовательского интерфейса дляначать с.Вы будете блокировать пользовательский интерфейс до тех пор, пока он не завершится, что не очень хорошая идея.Делайте все это в фоновом потоке - тогда вы все равно можете использовать Invoke
, если хотите, и пока он выполняет вычисления, пользовательский интерфейс все равно будет отзывчивым.