C# Таймер накопления обратного отсчета

У меня есть приложение, в котором я буду отображать таймер.

Пользователь будет выполнять событие и должен завершить его за определенное время. В настоящее время у меня есть таймер, который показывает их время, но сейчас мне нужно общее накопленное время. Таким образом, каждый раз, когда начинается новое событие, время его завершения добавляется к их накопленному времени. Затем, когда они выполняют событие, время отсчитывает накопленное время.

Это то, что у меня есть для "текущего таймера"

u.StartingTime = u.ChangeOverStandard;
u.CurrentChangeOverTime = u.StartingTime - (DateTime.Now - u.ChangeOverStart);

Все эти поля являются временными интервалами. Это идеально работает для их «текущего» таймера.

Но мне нужен «общий» таймер, который будет либо показывать положительное значение временного промежутка... если они будут выполнены раньше, чем они должны... или отрицательное значение временного промежутка, если они занимают слишком много времени.

РЕДАКТИРОВАТЬ:

Итак, я хочу добиться этого:

Например: для «события 1» у пользователя есть 30 сек. в конец. Затем у пользователя есть свойство «TotalTimespan» = 30. Это общее количество уменьшается с помощью таймера события. Допустим, он заканчивает за 24 секунды. Это означает, что у него осталось 6 секунд в TotalTimespan. Тогда «событие 2» должно быть завершено за 40 секунд. Итак, в начале event2 TotalTimespan = TotalTimespan(6) + 40. = 46. Если пользователь использует 60 секунд, тогда TotalTimespan = 46 -60 = -14.

«Таймер» не является таймером и не может использоваться в качестве таймера. Он работает в фоновом режиме, который также выполняет несколько других вычислений. Так что я не могу просто снимать время по одной секунде за раз.

В каждом новом событии я пытался

u.AccumulatedTime += u.ChangeOverStandard;

а потом

u.AccumulatedTime -= u.StartingTime - (DateTime.Now - u.ChangeOverStart);

Но очевидно, что это не сработает, потому что он берет общее прошедшее время из накопленного времени каждый раунд в моем цикле.

DateTime.Now - u.ChangeOverStart

^^Дай мне время, прошедшее с начала события до настоящего момента, так это то, что я хочу?

u.AccumulatedTime -= DateTime.Now - u.ChangeOverStart;

person CSharpDev    schedule 25.06.2012    source источник
comment
Не могу понять как получить сумму. Я знаю, что это должно быть просто, просто не могу понять. Мне нужно общее количество ... поэтому каждый раз, когда я добавляю свой стандарт к общему количеству и считаю, пока пользователь не закончит   -  person CSharpDev    schedule 26.06.2012
comment
Ну, проблема в том... чего ты хочешь достичь. Например: для события 1 у пользователя есть 30 сек. в конец. Затем пользователь имеет свойство TotalTimespan = 30. Это общее количество уменьшается с помощью таймера события. Допустим, он заканчивает за 24 секунды. Это означает, что у него осталось 6 секунд в TotalTimespan. Тогда событие2 должно быть завершено за 40 секунд. Итак, в начале event2 TotalTimespan = TotalTimespan(6) + 40. = 46. Если пользователь использует 60 секунд, тогда TotalTimespan = 46 -60 = -14. Я хорошо понял?   -  person Raphaël Althaus    schedule 26.06.2012
comment
Кстати, вы могли бы дать немного больше кода, может быть...   -  person Raphaël Althaus    schedule 26.06.2012
comment
Это точно. Я не хотел публиковать много кода, потому что знаю, что это вызовет путаницу. Я отредактирую свой пост.   -  person CSharpDev    schedule 26.06.2012


Ответы (1)


Все, что вам нужно, это TimeSpan и две статические (глобальные) переменные DateTime для отслеживания времени и выполнения вычислений. Вот пример использования описанных вами чисел:

        TimeSpan left = new TimeSpan(0, 0, 30);  //30 seconds allowed for task.
        DateTime start = DateTime.UtcNow;
        //User perform action.
        System.Threading.Thread.Sleep(24000); //24 sec wait.
        DateTime stop = DateTime.UtcNow;
        left = left - (stop - start);
        Console.WriteLine(Math.Ceiling((double)left.TotalSeconds));
        //Output was: 6
        left = left + new TimeSpan(0, 0, 40);  //40 seconds allowed for task.
        start = DateTime.UtcNow;
        //User perform action.
        System.Threading.Thread.Sleep(60000); //60 sec wait.
        stop = DateTime.UtcNow;
        left = left - (stop - start);
        Console.WriteLine(Math.Ceiling((double)left.TotalSeconds));
        //Output was: -14
        left = left + new TimeSpan(0, 0, 30);  //30 seconds allowed for task.
        Console.WriteLine(Math.Ceiling((double)left.TotalSeconds));
        //Output was: 16

Как видите, оставшееся время в конце составляет 16 секунд, как и следовало ожидать.

person Cornelius J. van Dyk    schedule 23.03.2021
comment
Корнелиус, обязательно смотрите ДАТЫ по вопросам. Вы только что ответили на вопрос 2012 года. В последний раз автора оригинала видели в 2017 году... - person Idle_Mind; 23.03.2021
comment
@Idle_Mind Конечно, мы не хотим просто НЕ отвечать на старые вопросы, не так ли? Если это так, старые вопросы без ответов лучше удалить. Тот факт, что спрашивающий, возможно, нашел обходной путь, не означает, что кто-то другой не получит пользы от предоставленного ответа. - person Cornelius J. van Dyk; 25.03.2021