Создание в 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); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д