Ускорит ли использование нескольких потоков мое приложение для обработки файлов HTML? - PullRequest
3 голосов
/ 08 июня 2011

Я только что закончил свое самое сложное и загруженное WinForms приложение на сегодняшний день.Он загружает список любого количества файлов HTML, затем загружает содержимое одного, использует некоторое RegEx, чтобы сопоставить некоторые теги и удалить или заменить их (да, да, я видел это . Работает просто отличноСпасибо Cthulu), затем записывает его на диск.

Однако я заметил, что для обработки ~ 200 файлов требуется примерно 30 секунд, а через первые 5-10 секунд программа отображается как «Не отвечает».Я предполагаю, что не стоит делать что-то вроде , который этот парень сделал , поскольку жесткий диск является узким местом.

Возможно, можно было бы загрузить как можно больше в память, затем обработать каждый потоком, записать их и загрузить еще немного в память?

По крайней мере, создало бы рабочий поток, отдельный от потока пользовательского интерфейса, предотвращение проблемы "Не отвечает"?( В этой статье MSDN рассматривается то, что я рассматривал. )

Наверное, я спрашиваю, предложит ли многопоточность какое-либо улучшение скорости, и если да, то каким будет лучший способсобирается об этом?

Любая помощь или совет высоко ценится!

Ответы [ 5 ]

3 голосов
/ 08 июня 2011

Да, вы должны начать с использования Backgroundworker, чтобы отделить вашу работу от GUI.Обработка события GUI никогда не должна занимать слишком много времени.Цель 20 мс, а не 20 с.

Тогда в качестве бонуса вы можете увидеть, можно ли разделить обработку (интенсивная загрузка ЦП) на независимые задания и выполнить их как задачи TPL.

Недостаточно информации, чтобы сказать, следует ли вам это делать или как.

2 голосов
/ 08 июня 2011

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

Фактическое повышение производительности зависит от количества процессоров, которые у вас есть,не количество потоков.

Так что если у вас есть P потоков, вы можете разделить работу на P рабочих элементов и получить некоторое улучшение работы.( Закон Амдала )

Вы можете использовать BackgroundWorker для правильного разделения работы.: C # BackgroundWorker Tutorial

2 голосов
/ 08 июня 2011

Потоки заданий, задач и т. Д. В большинстве случаев не позволяют первичному или основному потоку перестать отвечать на запросы. Не создавайте несколько потоков для дискового ввода-вывода (очевидно). Я бы посвятил один рабочий поток выводу файлов из очереди и обработке дискового ввода-вывода. В противном случае для обработки в памяти должно быть достаточно одного или двух рабочих потоков, в то время как основной поток может оставаться отзывчивым.

0 голосов
/ 08 июня 2011

Если вы выполняете всю свою обработку в GUI-потоке, ваше приложение покажет «не отвечает», если это займет очень много времени. На мой взгляд, вы никогда не должны выполнять (обширные) действия по обработке в том же потоке, что и ваш графический интерфейс. Кроме того, вы можете даже создать поток для каждого файла, который будет обработан. Это, скорее всего, ускорит процесс, если отдельным потокам не требуются данные друг от друга.

0 голосов
/ 08 июня 2011

Почему бы не использовать StreamReader.ReadAllLines (), чтобы прочитать каждый файл в массив, а затем обработать каждый элемент массива?

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