Почему этот код Parallel.ForEach замораживает программу?

Еще вопросы новичка:

Этот код берет несколько прокси из списка в главном окне (я не мог понять, как сделать переменные доступными между разными функциями) и делает проверку каждого из них (простой httpwebrequest), а затем добавляет их в список под названием finishedProxies.

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

private void start_Click(object sender, RoutedEventArgs e)
        {
            // Populate a list of proxies
            List proxies = new List();
            List finishedProxies = new List();

            foreach (string proxy in proxiesList.Items)
            {
                proxies.Add(proxy);
            }

            Parallel.ForEach(proxies, (i) =>
            {
                string checkResult;
                checkResult = checkProxy(i);

                finishedProxies.Add(checkResult);
                // update ui
                /*
                 status.Dispatcher.Invoke(
                  System.Windows.Threading.DispatcherPriority.Normal,
                  new Action(
                    delegate()
                    {
                        status.Content = "hello" + checkResult;
                    }
                )); */
                // update ui finished


                //Console.WriteLine("[{0}] F({1}) = {2}", Thread.CurrentThread.Name, i, CalculateFibonacciNumber(i));
            });


        }

Я пробовал использовать закомментированный код для внесения изменений в пользовательский интерфейс внутри Parallel.Foreach, и это приводит к зависанию программы после нажатия кнопки запуска. Это работало у меня и раньше, но я использовал класс Thread.

Как я могу обновить пользовательский интерфейс внутри Parallel.Foreach и как сделать так, чтобы Parallel.Foreach работал так, чтобы он не заставлял пользовательский интерфейс зависать во время работы?

Вот весь код.

17
задан dsp_099 3 December 2011 в 04:19
поделиться