Работает параллельно в фоновом режиме - PullRequest
0 голосов
/ 14 декабря 2011

Основной вопрос: как запустить код в TestingButton_Click для нескольких потоков в фоновом режиме (аналогично BackgroundWorker), чтобы я смог:
1. Получить все исходные данные для методов
2. Отменить тест для всех потоков одновременно
3. Отчет о проделанной работе
4. Извлеките все таблицы результатов в основной поток.

Следующий код находится внутри TestingButton_Click

List<Thread> threads = new List<Thread>();

            //Testing for each pair
            foreach (InterfaceWithClassName aCompound in Group1)
            {
                foreach (InterfaceWithClassName bCompound in Group2)
                {
                    InstancePair pair = new InstancePair();
                    //some code

                    if (testModeParallel)
                    {
                        Thread thr = new Thread(TestPairParallel);
                        thr.Start(pair);
                        threads.Add(thr);
                    }

                    else
                    {
                        Thread thr = new Thread(TestPairSerial);
                        thr.Start(pair);
                        threads.Add(thr);
                    }
                }
            }              

            while (true)
            {
                int i = 0;

                foreach (Thread thread in threads)
                {
                    if (thread.IsAlive)
                        break;

                    i++;
                }

                if (i == threads.Count)
                    break;

                Thread.Sleep(1000);
            }
            pairsResultsDataGrid.ItemsSource = tab.DefaultView

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

Структура TestPairSerial () имеет значение

        do
        {
            do
            {

            } while (isSetbCompaundParams);

        } while (isSetaCompaundParams);

        //filling up results into tables (main window variables) later to be connected to DataGrids

TestPairParallel () реализован с InfinitePartitioner и использует аналогичную структуру только с Parallel.ForEach (new InfinitePartitioner (), ...

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

Используйте задачи .NET 4.0 вместо создания новых потоков самостоятельно. Задачи обеспечивают более тонкую детализацию управления, упрощают передачу данных в фоновую операцию и обеспечивают превосходную поддержку для ожидания результатов по нескольким параллельным задачам и для отмены всего одним махом, если это необходимо. Настоятельно рекомендуется.

1 голос
/ 14 декабря 2011

Как запустить код в TestingButton_Click в нескольких потоках в фон.

Я бы использовал Задание , так как они были разработаны, чтобы делать именно то, что вы хотите.

Единственный другой вопрос, на который я отвечу, пока вы не приблизитесь к фактическому решению, - это следующее:

Сообщить о прогрессе

Существует множество способов сообщить о ходе выполнения в определенном потоке, вам необходимо подписаться на событие и написать код, чтобы сообщить о ходе выполнения потока. Чтобы обновить элемент управления в форме, вам потребуется вызвать изменение, это не тривиальная функция.

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