Это одна и та же программа, несколько данных шаблон SPMD .По сути, вы создаете отдельную программу или граф объектов для каждой задачи (задача в конечном итоге назначается в потоке).Экземпляры переменных, которые являются глобальными для графа объектов, будут хороши (поэтому не статические глобальные переменные), но все равно нужно будет беспокоиться об общих ресурсах, таких как файлы.
Одним из способов решения этих типов проблем является назначение каждому экземпляру задачи уникального идентификатора или «ранга» и использование его для определения ресурсов и присвоения им имен.В вашем примере файла каждая задача выдаст файл с именем myoutput_ {rank} .txt.Если то, что вы на самом деле хотите, это один файл, то ваше приложение должно реализовать этап постобработки, агрегации, в котором результаты объединяются.Это происходит последовательно после окончания параллелизма.Это как карта / уменьшить.Каждая из ваших параллельных задач запускает одну и ту же «программу» для сопоставления некоторых входных данных с выходным набором данных (файл в вашем случае), а затем на отдельном этапе вы уменьшаете или объединяете результаты в окончательный ответ.
Вот пример:
static void Main()
{
const int maxJobs = 10;
// Run jobs and wait...
List<Task> tasks = new List<Task>();
for (int rank = 0; rank < maxJobs; rank++)
tasks.Add(Task.Factory.StartNew((r) => { new MyApp().Main((int)r); }, rank));
Task.WaitAll(tasks.ToArray());
// Aggregate results...
StringBuilder sb = new StringBuilder();
for (int rank = 0; rank < maxJobs; rank++)
sb.AppendLine(File.ReadAllText("results_" + rank + ".txt"));
Console.WriteLine(sb.ToString());
File.WriteAllText("results_final.txt", sb.ToString());
Console.ReadLine();
}
public class MyApp
{
public void Main(int rank)
{
Console.WriteLine("Starting {0}", rank);
File.WriteAllText("results_" + rank + ".txt", "result data " + rank);
}
}
У класса MyApp может быть сколько угодно состояний.Он может даже совместно использовать это состояние с дочерними объектами, но он не должен иметь статического состояния или общего состояния с глобальными объектами, которые определены для чтения / записи вне MyApp.
Можно использовать глобальное состояние только для чтения.Например, все экземпляры MyApp могут считывать входные данные из одного файла.Что не в порядке, так это наличие нескольких экземпляров MyApp, читающих и , записывающих данные в (одну) глобальную переменную, экземпляр объекта или другой ресурс, например, файл, без реализации какой-либо формы координации (например, блокировки).
В приведенном выше примере каждая задача создает локальный файл results_ {rank} .txt.Их содержимое объединяется в один файл результатов, results_final.txt, на отдельном этапе агрегирования.Это невозможно сделать параллельно, потому что тогда все задачи будут записываться в один глобальный ресурс.
Многие из этих концепций описаны в книге, а примеры вы можете найти здесь.Контент также доступен (бесплатно) на MSDN.
http://parallelpatterns.codeplex.com/