Ni!E$H_WAGH Ответов: 4

Как создать несколько потоков на основе количества файлов ?


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

Что я уже пробовал:

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

johannesnestler

Да, это должно быть возможно (если это "хорошая идея", зависит от вашего контекста - по моему опыту, многопоточность с привязкой к IO может быть не такой уж большой вещью).
Так в чем же ваша конкретная проблема? создание потоков? читаешь файлы? Вы не показали никакого кода, чтобы угадать, что может быть вашим препятствием.
Так или иначе: из FileDialog вы получаете список имен файлов, перебираете их, создаете поток для обработки для каждого. Пусть они бегают и синхронизируются. Я бы использовал TaskParallelLib (задачи) вместо создания потока в старом стиле....

Ni!E$H_WAGH

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

4 Ответов

Рейтинг:
2

Maciej Los

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

Для получения более подробной информации, пожалуйста, смотрите:
Многопоточность (C#) | Microsoft Docs[^]
Многопоточные Приложения (C#) | Microsoft Docs[^]
Пошаговое руководство: многопоточность с компонентом BackgroundWorker (C#) | Microsoft Docs[^]


CPallini

5.

Maciej Los

Спасибо, Карло.

Рейтинг:
1

pt1401

Я не знаю, почему вы указали 1 файл = 1 поток, может быть, для этого есть веская причина.
Но если ваша причина заключается только в том, чтобы выполнять обработку файлов в фоновом режиме, не обременяя поток пользовательского интерфейса, исследуйте использование async/await для выполнения трудоемких операций ввода-вывода.
Оставляя пользовательский интерфейс свободным и отзывчивым.


Ni!E$H_WAGH

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

Рейтинг:
0

CPallini

Цитата:
если пользователь выбрал 2 потока, то я должен создать только 2 потока, и каждый отдельный поток должен обрабатывать один файл параллельно. Возможно ли это ?
Полагаю, вы имели в виду: "если пользователь выбирает 2 файлы тогда я должен создать 2 потока. Каждый поток должен обрабатывать файл. Возможно ли это?"
Да, это, конечно, возможно.
Я предлагаю вам прочитать учебник по многозадачности в C#.


Рейтинг:
0

pt1401

Если вы хотите использовать многопоточные процессы ввода-вывода, вы можете исследовать их Порты Завершения Ввода-Вывода[^]