Как организовать подсчёт времени выполнения задачи?
Вот моя модель:
public class Task
{
public int Id { get; set; }
public int? ParentId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public TaskStatus TaskStatus { get; set; }
public TimeSpan ActualPerformanceTime { get; set; } //время выполнения задачи
}
public enum TaskStatus
{
Appointed, //зарегистрирована в системе
CarriedOut, //выполняется
Suspended, //приостановлена
Completed, //завершена
}
Пока в голову пришла лишь мысль добавить в модель новое свойство
public DateTime StartPerformanceDate { get; set; }
Тогда использовать для подсчёта времени выполнения в определённый момент следующую функцию:
public TimeSpan CalcActualPerformanceTime(TaskManagerContext dbcontext, Models.Task task)
{
var targetTask = task;
//Если задача не выполняется, вернуть последнее вычисленное время выполнения
if (targetTask.TaskStatus!= Models.TaskStatus.CarriedOut)
return targetTask.ActualPerformanceTime;
//Иначе вычислить время выполнения задачи на данный момент
var tempPerformanceTime = DateTime.Now - task.StartPerformanceDate;
targetTask.ActualPerformanceTime += tempPerformanceTime;
targetTask.StartPerformanceDate = DateTime.Now;
dbcontext.Update(targetTask);
return targetTask.ActualPerformanceTime;
}
Для остановки, продолжения выполнения и для завершения задачи использовать следующие функции:
public void PauseTask(TaskManagerContext dbcontext, Models.Task task)
{
var targetTask = task;
CalcActualPerformanceTime(dbcontext, targetTask);
targetTask.TaskStatus = Models.TaskStatus.Suspended;
dbcontext.Update(targetTask);
}
public void StartTask(TaskManagerContext dbcontext, Models.Task task)
{
var targetTask = task;
targetTask.TaskStatus = Models.TaskStatus.CarriedOut;
targetTask.StartPerformanceDate = DateTime.Now;
dbcontext.Update(targetTask);
}
public void FinishTask(TaskManagerContext dbcontext, Models.Task task)
{
var targetTask = task;
targetTask.TaskStatus = Models.TaskStatus.Completed;
CalcActualPerformanceTime(dbcontext, targetTask);
dbcontext.Update(targetTask);
}