2011-12-14 3 views
0

Главный вопрос: Как запустить код в 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 (новый InfinitePartitioner(), ...

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

+1

В чем именно заключается ваш вопрос. Ваше первое предложение не имеет смысла. Придумайте один вопрос. Я предлагаю вам потерять справочную информацию, поскольку она не имеет никакого отношения к вашей текущей проблеме. –

+0

Взгляните на класс [Задача] (http://msdn.microsoft.com/en-us/library/dd537609.aspx) – oleksii

+0

Пожалуйста, выберите один вопрос, который нужно задать, и опубликуйте только информацию, относящуюся к этому вопросу. – Gabe

ответ

1

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

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

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

Доклад о ходе

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

+0

Спасибо. Я лучше изучу TPL, прежде чем задавать дополнительные вопросы. Кажется, каждый из вас указывает мне в этом направлении. – Vitaly

2

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

+0

Предоставляют ли они отчет о ходе работы? (Как BackgroundWorker). – Vitaly

+0

@Vitaly - Они могут ... Если вы его закодируете.В BackgroundWorker нет ничего особенного, у него есть только события, на которые вы можете подписаться. Вам все равно придется писать код, чтобы обновить некоторый элемент управления, используя Invoke. –

Смежные вопросы