Создание в background_worker пул потоков - C#
Формулировка задачи:
Всем привет!!! столкнулся с проблемой не могу решить, вот допустим мы считываем все текстовые файлы, которые находятся в папке, эту работу удобно переложить на background_worker, а можно ли по мере того как мы находим файлы производить их обработку в thread_pool, при этом чтобы background worker не подвисал, то еcть чтобы он дорабатывал и вызывал бы backgroundWorker1_RunWorkerCompleted, в то время как работа в пулах потоков бы всё ещё шла? написал такой примерно код, но он падает :
я вообще как понимаю как должен он работать : при вызове метода loadFiles - мы создаем поток который хранит и ожидает пула потоков.
Может кто сталкивался с данной проблемой?
Помогите пожалуйста!!!
Всем спасибо за внимание!!!
Листинг программы
- private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
- {
- String res = (String)e.Argument;
- var nameFiles = Directory.EnumerateFiles(res);
- int i = 0;
- foreach (string file in nameFiles)
- {
- i++;
- loadFiles(file);
- backgroundWorker1.ReportProgress(i * 5);
- }
- }
- private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
- {
- progressBar1.Value = e.ProgressPercentage;
- this.Text = e.ProgressPercentage.ToString();
- }
- private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
- {
- progressBar1.Value = 100;
- }
- private void loadFiles(string file)
- {
- ManualResetEvent ev = new ManualResetEvent(false);
- MyAsyncInfo info = new MyAsyncInfo();
- info.fileName = file;
- ThreadPool.QueueUserWorkItem((object obj) =>
- {
- callBackLoad(info); // тут загружаем данные в память
- ev.Set();
- });
- ev.WaitOne();
- ManualResetEvent even = new ManualResetEvent(false);
- ThreadPool.QueueUserWorkItem((object obj) =>
- {
- handle(info); // тут обрабатываем данные и сохраняем в другой файл
- even.Set();
- });
- even.WaitOne();
- }
Решение задачи: «Создание в background_worker пул потоков»
textual
Листинг программы
- List<string> processedFiles = new List<string>();
- private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
- {
- processedFiles.Clear();
- var nameFiles = Directory.EnumerateFiles((string)e.Argument);
- int i = 0;
- foreach (string file in nameFiles)
- {
- ThreadPool.QueueUserWorkItem(loadFiles, file);
- i++;
- backgroundWorker1.ReportProgress(i * 5);
- }
- }
- private void loadFiles(object state)
- {
- string file = (string)state;
- callBackLoad(file);
- handle(file);
- lock (processedFiles) processedFiles.Add(file);
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д