#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 будут автоматически развернуты в отдельных потоках, чтобы ваш пользовательский интерфейс оставался отзывчивым.