Рабочий процесс параллельных задач
Я надеюсь получить помощь по проблеме, с которой я столкнулся. Итак, проблема в том, что я запускаю параллельные задачи для поиска файлов в папках. Каждая задача включает в себя идентификацию файлов и добавление их в массив файлов. Затем дождитесь завершения каждой задачи, чтобы файлы были собраны, а затем выполните сортировку результатов. Затем обработайте отсортированный файл независимо, запустив по одной задаче для каждого файла, чтобы прочитать его и получить обратно соответствующий шаблон. Заключительный этап - объединить все результаты в удобочитаемом формате и отобразить их в удобном для пользователя виде.
Итак, вопрос в том, что я хочу правильно связать задачи, чтобы не блокировать поток пользовательского интерфейса. Я хотел бы иметь возможность отменить все на любом этапе программы.
Подвести итог:
Этап 1: Найдите файлы с помощью поиска в папках. Каждая задача выполняет рекурсивный поиск в дереве папок.
Этап 2: отсортируйте все найденные файлы и удалите дубликаты.
Этап 3: Запустите новые задачи для независимой обработки файлов. Каждая задача открывает файл и ищет соответствующий шаблон.
Этап 4: объединить результаты поиска по каждому файлу в один гигантский набор результатов и сделать его удобным для чтения человеком.
List<Task> myTasks = new List<Task>();
// ==== stage 1 ======
for(int i = 0; i < 10; i++) {
string directoryName = directories[i];
Task t = new Task(() =>
{
FindFiles(directoryName);
});
myTasks.Add(t);
t.Start();
}
// ==== stage 2 ====
Task sortTask = Task.Factory.ContinueWhenAll(myTasks.ToArray(), (t) =>
{
if(_fileResults.Count > 1) {
// sort the files and remove any duplicates
}
});
sortTask.Wait();
// ==== stage 3 ====
Task tt = new Task(() =>
{
Parallel.For(0, _fileResults.Count, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount, CancellationToken = token, TaskScheduler = _taskScheduler },
(i, loopstate) => {
// 1. open file
// 2. read file
// 3. read file line by line
}
}
// == stage 4 ===
tt.ContinueWith((t) =>
{
// 1. aggregate the file results into one giant result set
// 2. display the giant result set in human readable format
}, token, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext());
tt.start();
Task
. Если вы хотите создать задачу, представляющую выполнение делегата, используйтеTask.Run
для создания и запуска такой задачи. - person Servy   schedule 05.01.2016List
, чтобы добавить свои результаты.List
не является потокобезопасным, поэтому это не обязательно сработает. Каждая задача должна возвращать значение, которое она создает при вычислении своего результата, и иметь доступ к продолжению (ям), полученным в результате, черезTask
API. - person Servy   schedule 05.01.2016