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