Лучший Таймер для использования в службе Windows

108
задан shA.t 18 March 2015 в 09:30
поделиться

4 ответа

И System.Timers.Timer и System.Threading.Timer будет работать на сервисы.

таймеры, которых Вы хотите избежать, System.Web.UI.Timer и System.Windows.Forms.Timer , которые являются соответственно для приложений ASP и WinForms. Используя тех вызовет сервис загрузить дополнительный блок, который не действительно необходим для типа приложения, которое Вы создаете.

Использование System.Timers.Timer как следующий пример (также, удостоверьтесь, что Вы используете переменную уровня класса для предотвращения сборки "мусора", как указано в ответе Tim Robinson):

using System;
using System.Timers;

public class Timer1
{
    private static System.Timers.Timer aTimer;

    public static void Main()
    {
        // Normally, the timer is declared at the class level,
        // so that it stays in scope as long as it is needed.
        // If the timer is declared in a long-running method,  
        // KeepAlive must be used to prevent the JIT compiler 
        // from allowing aggressive garbage collection to occur 
        // before the method ends. (See end of method.)
        //System.Timers.Timer aTimer;

        // Create a timer with a ten second interval.
        aTimer = new System.Timers.Timer(10000);

        // Hook up the Elapsed event for the timer.
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

        // Set the Interval to 2 seconds (2000 milliseconds).
        aTimer.Interval = 2000;
        aTimer.Enabled = true;

        Console.WriteLine("Press the Enter key to exit the program.");
        Console.ReadLine();

        // If the timer is declared in a long-running method, use
        // KeepAlive to prevent garbage collection from occurring
        // before the method ends.
        //GC.KeepAlive(aTimer);
    }

    // Specify what you want to happen when the Elapsed event is 
    // raised.
    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
    }
}

/* This code example produces output similar to the following:

Press the Enter key to exit the program.
The Elapsed event was raised at 5/20/2007 8:42:27 PM
The Elapsed event was raised at 5/20/2007 8:42:29 PM
The Elapsed event was raised at 5/20/2007 8:42:31 PM
...
 */

, Если Вы выбираете System.Threading.Timer, можно использовать следующим образом:

using System;
using System.Threading;

class TimerExample
{
    static void Main()
    {
        AutoResetEvent autoEvent     = new AutoResetEvent(false);
        StatusChecker  statusChecker = new StatusChecker(10);

        // Create the delegate that invokes methods for the timer.
        TimerCallback timerDelegate = 
            new TimerCallback(statusChecker.CheckStatus);

        // Create a timer that signals the delegate to invoke 
        // CheckStatus after one second, and every 1/4 second 
        // thereafter.
        Console.WriteLine("{0} Creating timer.\n", 
            DateTime.Now.ToString("h:mm:ss.fff"));
        Timer stateTimer = 
                new Timer(timerDelegate, autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every 
        // 1/2 second.
        autoEvent.WaitOne(5000, false);
        stateTimer.Change(0, 500);
        Console.WriteLine("\nChanging period.\n");

        // When autoEvent signals the second time, dispose of 
        // the timer.
        autoEvent.WaitOne(5000, false);
        stateTimer.Dispose();
        Console.WriteLine("\nDestroying timer.");
    }
}

class StatusChecker
{
    int invokeCount, maxCount;

    public StatusChecker(int count)
    {
        invokeCount  = 0;
        maxCount = count;
    }

    // This method is called by the timer delegate.
    public void CheckStatus(Object stateInfo)
    {
        AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
        Console.WriteLine("{0} Checking status {1,2}.", 
            DateTime.Now.ToString("h:mm:ss.fff"), 
            (++invokeCount).ToString());

        if(invokeCount == maxCount)
        {
            // Reset the counter and signal Main.
            invokeCount  = 0;
            autoEvent.Set();
        }
    }
}

Оба примера прибывает из страниц MSDN.

118
ответ дан Andrew Moore 24 November 2019 в 03:32
поделиться

Не используйте сервис для этого. Создайте нормальное приложение и создайте запланированную задачу для выполнения его.

Это - обычно сохраненная лучшая практика. Jon Galloway соглашается со мной. Или возможно это наоборот. Так или иначе, факт - то, что это не лучшие практики для создания сервиса окон работать, неустойчивая задача убегает таймер.

, "Если Вы пишете службу Windows, которая выполняет таймер, необходимо переоценить решение".

†“Jon Galloway, ASP.NET диспетчер программ сообщества MVC, автор, супергерой неполного рабочего дня

37
ответ дан Cody Gray 24 November 2019 в 03:32
поделиться

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

Однако легко неправильно использовать Систему. Таймеры. Таймер. Если Вы не храните Объект - таймер в переменной где-нибудь, то склонно быть собранным "мусор". Если это произойдет, Ваш таймер больше не будет стрелять. Назовите Расположить метод, чтобы остановить таймер или использовать Систему. Поточная обработка. Класс таймера, который является немного более хорошей оберткой.

, Какие проблемы Вы видели до сих пор?

7
ответ дан Tim Robinson 24 November 2019 в 03:32
поделиться

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

Это будет:

  • Уменьшают код инфраструктуры, который копирует поведение планировщика
  • , Обеспечивают большую гибкость с точки зрения планирования поведения (например, только работайте по выходным) со всей логикой планирования, абстрагированной от кода приложения
  • , Используют параметры командной строки для параметров, не имея необходимость устанавливать значения конфигурации в файлах конфигурации и т.д.
  • Намного легче отлаживать/тестировать во время разработки
  • , Позволяют пользователю поддержки выполняться путем вызова консольного приложения непосредственно (например, полезный во время ситуаций с поддержкой)
2
ответ дан user32378 24 November 2019 в 03:32
поделиться
Другие вопросы по тегам:

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