Как создать режимы расчёта проекта в Aspose.Tasks

При работе с проектами различные сценарии могут требовать разных подходов к пересчёту графиков, затрат или ресурсов. Aspose.Tasks for .NET предоставляет гибкие режимы расчёта, поэтому вы можете решать, должны ли свойства проекта обновляться автоматически, вручную или вообще не пересчитываться. Это обеспечивает полный контроль над производительностью, точностью и поведением файлов проекта.

Режимы расчёта проекта

Aspose.Tasks for .NET API предоставляет три режима расчёта проекта, которые определяют, как вычисляются значения зависимых свойств при установке значения свойства.
Выбор правильного режима позволяет найти баланс между эффективностью и точностью в зависимости от вашего сценария использования.

Эти режимы расчёта:

Примеры ниже демонстрируют, как каждый режим может применяться в коде.

Режим расчёта проекта — Отключено

В этом режиме проект пропускает пересчёт. Это эффективно при пакетных обновлениях или когда нужно изменить только исходные значения без корректировки зависимостей.

 1// Create empty project and set calculation mode to None
 2Project project = new Project();
 3project.CalculationMode = CalculationMode.None;
 4
 5// Add a new task
 6Task task = project.RootTask.Children.Add("Task");
 7
 8// Note that even ids were not calculated
 9Console.WriteLine("Task.Id Equals 0 : {0} ",  task.Get(Tsk.Id).Equals(0));
10Console.WriteLine("Task.OutlineLevel Equals 0 : {0} ", task.Get(Tsk.OutlineLevel).Equals(0));
11Console.WriteLine("Task Start Equals DateTime.MinValue : {0} ", task.Get(Tsk.Start).Equals(DateTime.MinValue));
12Console.WriteLine("Task Finish Equals DateTime.MinValue : {0} ", task.Get(Tsk.Finish).Equals(DateTime.MinValue));
13Console.WriteLine("Task Duration Equals 0 mins : {0} ", task.Get(Tsk.Duration).ToString().Equals("0 mins"));
14
15// Set duration property
16task.Set(Tsk.Duration, project.GetDuration(2, TimeUnitType.Day));
17Console.WriteLine("Task Duration Equals 2 days : {0} ", task.Get(Tsk.Duration).ToString().Equals("2 days"));
18Console.WriteLine("Task Start Equals DateTime.MinValue  : {0} ", task.Get(Tsk.Start).Equals(DateTime.MinValue));
19Console.WriteLine("Task Finish Equals DateTime.MinValue  : {0} ", task.Get(Tsk.Finish).Equals(DateTime.MinValue));

Режим расчёта проекта — Ручной

Ручной режим обновляет свойства зависимых объектов, но не вызывает глобальные пересчёты.
Это позволяет сбалансировать производительность и согласованность связанных значений.

 1// Create empty project and set calculation mode to Manual
 2Project project = new Project();
 3project.CalculationMode = CalculationMode.Manual;
 4
 5// Set project start date and add new tasks
 6project.Set(Prj.StartDate, new DateTime(2015, 4, 15));
 7Task task1 = project.RootTask.Children.Add("Task 1");
 8Task task2 = project.RootTask.Children.Add("Task 2");
 9
10// The necessary properties are set in manual mode
11Console.WriteLine("Task1.Id Equals 1 : {0} ", task1.Get(Tsk.Id).Equals(1));
12Console.WriteLine("Task1 OutlineLevel Equals 1 : {0} ", task1.Get(Tsk.OutlineLevel).Equals(1));
13Console.WriteLine("Task1 Start Equals 15/04/2015 08:00 AM : {0} ", task1.Get(Tsk.Start).Equals(new DateTime(2015, 4, 15, 8, 0, 0)));
14Console.WriteLine("Task1 Finish Equals 15/04/2015 05:00 PM : {0} ", task1.Get(Tsk.Finish).Equals(new DateTime(2015, 4, 15, 17, 0, 0)));
15Console.WriteLine("Task1 Duration Equals 1 day : {0} ", task1.Get(Tsk.Duration).ToString().Equals("1 day"));
16Console.WriteLine("Task2 Start Equals 15/04/2015 08:00 AM : {0} ", task2.Get(Tsk.Start).Equals(new DateTime(2015, 4, 15, 8, 0, 0)));
17Console.WriteLine("Task2 Finish Equals 15/04/2015 05:00 PM : {0} ", task2.Get(Tsk.Finish).Equals(new DateTime(2015, 4, 15, 17, 0, 0)));
18Console.WriteLine("Task2 Duration Equals 1 day : {0} ", task2.Get(Tsk.Duration).ToString().Equals("1 day"));
19
20// When we link two tasks together their dates are not recalculated in manual mode
21TaskLink link = project.TaskLinks.Add(task1, task2, TaskLinkType.FinishToStart);
22
23// Task 2 Start has not been changed
24Console.WriteLine("Task1 Start Equals Task2 Start : {0} ", task1.Get(Tsk.Start).Equals(task2.Get(Tsk.Start)));
25Console.WriteLine("Task1 Finish Equals Task2 Finish : {0} ", task1.Get(Tsk.Finish).Equals(task2.Get(Tsk.Finish)));

Режим расчёта проекта — Автоматический

Автоматический режим обеспечивает согласованность всех дат, затрат и значений работ сразу после изменения любой связанной величины.
Он обеспечивает максимальную точность и наиболее близок к тому, как Microsoft Project по умолчанию выполняет пересчёты.

 1// Create empty project and set calculation mode to Automatic
 2Project project = new Project();
 3project.CalculationMode = CalculationMode.Automatic;
 4
 5// Set project start date and add new tasks
 6project.Set(Prj.StartDate, new DateTime(2015, 4, 15));
 7Task task1 = project.RootTask.Children.Add("Task 1");
 8Task task2 = project.RootTask.Children.Add("Task 2");
 9
10// Link tasks
11TaskLink link = project.TaskLinks.Add(task1, task2, TaskLinkType.FinishToStart);
12
13// Verify dates have been recalculated
14Console.WriteLine("Task1 Start + 1 Equals Task2 Start : {0} ", task1.Get(Tsk.Start).AddDays(1).Equals(task2.Get(Tsk.Start)));
15Console.WriteLine("Task1 Finish + 1 Equals Task2 Finish : {0} ", task1.Get(Tsk.Finish).AddDays(1).Equals(task2.Get(Tsk.Finish)));
16Console.WriteLine("RootTask Finish Equals Task2 Finish : {0} ", task2.Get(Tsk.Finish).Equals(project.RootTask.Get(Tsk.Finish)));
17Console.WriteLine("Project Finish Date Equals Task2 Finish : {0} ", task2.Get(Tsk.Finish).Equals(project.Get(Prj.FinishDate))); 

Предоставляя три режима расчёта — Отключено, Ручной и Автоматический — Aspose.Tasks for .NET даёт разработчикам гибкость в выборе способа обработки данных проекта.
Будь то производительность, контроль, или точность, правильный режим расчёта позволяет вам обрабатывать обновления проекта наиболее эффективно для вашего сценария.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.