Вопрос о Multithread-.Net

#vb.net #multithreading

#vb.net #многопоточность

Вопрос:

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

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

Ответ №1:

Вот как я бы подошел к проблеме.

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

Во-вторых, используйте шаблон производитель-потребитель для обработки файлов, добавленных в очередь. Это проще всего выполнить, если ваша очередь имеет тип BlockingCollection . Самое приятное в BlockingCollection том, что он абстрагирует большую часть логики производителя-потребителя для вас. Take Метод блокируется до тех пор, пока в очередь не будет добавлен хотя бы один элемент. У вас может быть столько потоков, сколько вы хотите, отслеживающих эту очередь. Они будут терпеливо ждать, пока элементы не будут добавлены в очередь.

Вот несколько преимуществ использования этого подхода.

  • Это относительно легко реализовать, поскольку BlockingCollection уже потокобезопасно.
  • Требуемая степень параллелизма определяется количеством потоков, которые вы создаете для мониторинга очереди.
  • Обработка файлов не будет мешать FileSystemWatcher обработчикам событий, которые добавляют файлы в очередь.
  • Очередь действует как буфер, содержимое которого будет уменьшаться по мере изменения скорости появления файлов по сравнению со скоростью обработки этих файлов.

Ответ №2:

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

Для FileSystemMonitor проверьте здесь

http://www.codeproject.com/KB/files/monitor_all_filesystem.aspx

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

Соедините это с системой выполнения работы в фоновом режиме с помощью объектов BackGroundWorked, и вам вообще не придется напрямую иметь дело с несколькими потоками. BackgroundWorkers будут автоматически развернуты в отдельных потоках, чтобы ваш пользовательский интерфейс оставался отзывчивым.