2016-10-02 3 views
0

Это странная проблема, о которой я не мог найти много информации о результатах поиска.Parallel.ForEach - первая нить работает медленнее остальных

У меня есть элемент управления listview со списком видеофайлов. Я использую Parallel.ForEach для запуска отдельных потоков для обработки каждого видеофайла по кадру для движения. Каждый цикл через кадры включает в себя некоторые вызовы для обновления элементов управления в форме, которую я предполагаю обработкой основного потока (ID 1).

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

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

EDIT: Я заметил, что нить висит полностью, когда открыта другая форма.

Вот скриншот приложения, показывая первый поток работает позади остальных Motion application

Код

Parallel.ForEach<ListViewItem>(filesListView.Items.Cast<ListViewItem>(), new ParallelOptions() { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 1.0)) }, (item, state) => 
    { 
     Thread.Sleep(100); 
      if (CallToStop == true) 
      { 
       state.Break(); 
      } 
      internalProcessStart(item); 
     }); 
+0

Не может быть размер файла? –

+0

Вы вообще пытались удалить вызовы и проверить, связано ли это? – Zergatul

+0

@ TadijaBagarić Не связан размер файла, я пытался с тем же файлом копироваться снова и снова, и там тоже бывает. – user2924019

ответ

0

С помощью Хенка Holterman в комментариях, я нашел причина связана с тем, что Parallel.ForEach вызывается из потока пользовательского интерфейса, когда он должен быть потоком рабочего фона, чтобы поддерживать поток пользовательского интерфейса.

Я обновлю этот ответ, когда у меня будет правильный код, работающий с моим кодом.

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