Вопрос по c#, timer – Таймер C # или Thread.Sleep
Я запускаю службу Windows и использую цикл и Thread.Sleep для повторения задачи. Было бы лучше использовать метод таймера?
Если да, то пример кода был бы отличным
Я в настоящее время использую этот код, чтобы повторить
int curMinute;
int lastMinute = DateTime.Now.AddMinutes(-1).Minute;
while (condition)
{
curMinute = DateTime.Now.Minute;
if (lastMinute < curMinute) {
// do your once-per-minute code here
lastMinute = curMinute;
}
Thread.Sleep(50000); // sleeps for 50 seconds
if (error condition that would break you out of this) {
break; // leaves looping structure
}
}
ИМО. Таким образом, если ваш сервис попросят остановить, он может очень быстро отреагировать на это и просто не вызывать обработчик тиковых отметок таймера снова ... если вы спите, менеджеру сервиса придется подождать 50 секунд или убить ваш нить, ни одна из которых не очень приятно.
что сон - лучшая реализация с конечным автоматом. Это по-прежнему будет держать вас под контролем приложения в любое время, но позволит любой ответ, необходимый в любое конкретное время. Это также будет обрабатывать обратные вызовы таймера, которые короче, чем «время выполнения обработки в цикле»;
Например..
<!-- language: c# -->
public enum State
{
Idle = 0,
Processing = 1,
Stop = 100,
}
public void Run()
{
State state = State.Idle; // could be a member variable, so a service could stop this too
double intervalInSeconds = 60;
System.DateTime nextExecution = System.DateTime.Now.AddSeconds(intervalInSeconds);
while (state != State.Stop)
{
switch (state)
{
case State.Idle:
{
if (nextExecution > System.DateTime.Now)
{
state = State.Processing;
}
}
break;
case State.Processing:
{
// do your once-per-minute code here
// if you want it to stop, just set it state to stop.
// if this was a service, you could stop execution by setting state to stop, also
// only time it would not stop is if it was waiting for the process to finish, which you can handle in other ways
state = State.Idle;
nextExecution = System.DateTime.Now.AddSeconds(intervalInSeconds);
}
break;
default:
break;
}
System.Threading.Thread.Sleep(1);
}
}
Sleep
реализация, которую вы улучшаете. Это даже не проблема вTimer
решение на основе; Вы не определяете интервал ожидания, вы определяете интервал времени, когда нужно инициировать событие, поэтому вообще не нужно определять, как долго ждать.
или любой, в зависимости от ситуации.
Если у меня есть небольшой фрагмент кода, который необходимо запустить повторно, я, вероятно, использую таймер.
Если у меня есть фрагмент кода, выполнение которого может занять больше времени, чем таймер задержки (например, получение файлов с удаленного сервера через FTP, где я не контролирую или не знаю задержку в сети или размеры / количество файлов), я буду ждать в течение фиксированного периода времени между циклами.
Оба действительны, но, как указывалось ранее, они делают разные вещи. Таймер запускает ваш код каждые x миллисекунд, даже если предыдущий экземпляр еще не завершен. Thread.Sleep (x) ожидает некоторый период времени после завершения каждой итерации, поэтому общая задержка на цикл всегда будет длиннее (возможно, ненамного), чем период ожидания.
class Program
{
static void Main(string[] args)
{
Timer timer = new Timer(new TimerCallback(TimeCallBack),null,1000,50000);
Console.Read();
timer.Dispose();
}
public static void TimeCallBack(object o)
{
curMinute = DateTime.Now.Minute;
if (lastMinute < curMinute) {
// do your once-per-minute code here
lastMinute = curMinute;
}
}
см вопрос здесь) и я теперь использовалDispatchTimer
на основании полученных ответов.
Ответы содержат некоторые ссылки, которые могут оказаться полезными.
использование таймера является лучшим вариантом. Я пробовал решение, подобное вашему, в прошлом, и у меня возникли проблемы, при которых цикл перестал работать, и мне пришлось бы ждать другого Thread.Sleep (), прежде чем он снова сработает. Кроме того, это вызывало всевозможные проблемы с остановкой службы, и я получал постоянные ошибки о том, как она не отвечала и должна была закрываться.
Код @Prashanth должен быть именно тем, что вам нужно.