Проверка состояния параллельного цикла foreach - PullRequest
4 голосов
/ 27 сентября 2010

У меня довольно длинный параллельный цикл foreach, который мне нужно запустить. Более 100 компьютеров в сети будут доступны, и каждая операция на каждом компьютере займет несколько секунд. Параллельные циклы foreach кажутся идеальным решением для ускорения процесса.

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

1 Ответ

5 голосов
/ 27 сентября 2010

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

В качестве очень простого примера, если ваш код можно рассматривать как серию повторяющихся шагов, вы можете просто увеличить счетчик. Метод Interlocked.Increment() особенно полезен для этой цели, так как он делает это без блокировки. Затем ваш поток пользовательского интерфейса может периодически опрашивать этот счетчик и сообщать о его значении - или визуализировать его, если это возможно (например, индикатор выполнения или скользящее среднее).

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

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

В качестве альтернативы, если вы хотите собрать значительное количество показателей производительности вашего распределенного процесса, вы можете рассмотреть возможность использования API счетчиков производительности в System.Diagnostics . Это более сложный путь, но он позволяет использовать высокоэффективную реализацию сбора и публикации метрик в ОС и позволяет наблюдать и агрегировать информацию о производительности с помощью инструмента, подобного Perfmon .

.

Конкретные механизмы, которые вы используете для обновления пользовательского интерфейса, зависят от того, какую технологию вы используете (WPF, WinForms, HTML) и от того, есть ли в распределенном коде и коде пользовательского интерфейса какие-либо компоненты, размещенные в одном процессе. Если части распределенного / пользовательского интерфейса не размещены в одном процессе, вам, вероятно, потребуется использовать некоторую форму IPC для связи и визуализации прогресса.

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