Создание в background_worker пул потоков - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет!!! столкнулся с проблемой не могу решить, вот допустим мы считываем все текстовые файлы, которые находятся в папке, эту работу удобно переложить на background_worker, а можно ли по мере того как мы находим файлы производить их обработку в thread_pool, при этом чтобы background worker не подвисал, то еcть чтобы он дорабатывал и вызывал бы backgroundWorker1_RunWorkerCompleted, в то время как работа в пулах потоков бы всё ещё шла? написал такой примерно код, но он падает :
 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();
        }
я вообще как понимаю как должен он работать : при вызове метода loadFiles - мы создаем поток который хранит и ожидает пула потоков. Может кто сталкивался с данной проблемой? Помогите пожалуйста!!! Всем спасибо за внимание!!!

Решение задачи: «Создание в 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);
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5