Пишу таск-менеджер на ASP.NET. Как реализовать подсчёт времени выполнения задачи?

Как организовать подсчёт времени выполнения задачи?
Вот моя модель:
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);
        }
  • Вопрос задан
  • 564 просмотра
Решения вопроса 2
@kttotto
пофиг на чем писать
Для замера времени работы обычно используется Stopwatch.

А вообще не совсем понятен вопрос, если Вы вроде как все организовали. Что Вас не устраивает?
Ответ написан
Комментировать
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Не нужно хранить в базе ActualPerformanceTime, т.к.
  1. значение будет пересчитываться при каждом новом запросе
  2. оно должно допускать разрывы (паузы)

Можно каждой таске сопоставить таблицу один-ко-многим с временными отрезками:
class MyTimeSpan {
    public int Id { get; set;}
    public DateTime From { get; set; }
    public DateTime? To { get; set; }

    public int TaskId { get; set;}
    public Task Task { get; set;}
}

При старте MyTimeSpan.To остается null, при Stop или Pause - отрезок "закрывается". Если хоть один отрезок не закрыт, то таска находится в прогрессе (Task.TaskStatus не нужен. Тем более, что название свойства - тавтология).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@cicatrix
было бы большой ошибкой думать
Вы вообще почитайте про время жизни процесса в asp.net. Дело в том, что полагаться на исполнение каких-либо фоновых задач в приложении, которое IIS может в любой момент перезапустить, я бы не стал. Если вам необходимо серверное приложение, выполняющееся независимо от веб-морды, лучше писать его как отдельное приложение и размещать на сервере отдельной задачей.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы