Есть ли в C # класс таймера, которого нет в пространстве имен Windows.Forms? - PullRequest
17 голосов
/ 04 октября 2008

Я хочу использовать таймер в моем простом .NET приложении, написанном на C #. Единственный, который я могу найти, это класс Windows.Forms.Timer. Я не хочу ссылаться на это пространство имен только для моего консольного приложения.

Существует ли класс таймера C # (или подобный таймеру) для использования в консольных приложениях?

Ответы [ 6 ]

29 голосов
/ 04 октября 2008

System.Timers.Timer

И как MagicKat говорит:

System.Threading.Timer

Вы можете увидеть различия здесь: http://intellitect.com/system-windows-forms-timer-vs-system-threading-timer-vs-system-timers-timer/

И вы можете увидеть примеры MSDN здесь:

http://msdn.microsoft.com/en-us/library/system.timers.timer(VS.80).aspx

А здесь:

http://msdn.microsoft.com/en-us/library/system.threading.timer(VS.80).aspx

15 голосов
/ 04 октября 2008

Я бы рекомендовал класс Timer в пространстве имен System.Timers. Также представляет интерес класс Timer в пространстве имен System.Threading.

using System;
using System.Timers;

public class Timer1
{
    private static Timer aTimer = new System.Timers.Timer(10000);

    public static void Main()
    {
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        aTimer.Enabled = true;

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

    // 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);
    }
}

Пример из документов MSDN.

8 голосов
/ 01 августа 2010

По крайней мере, мне известны классы System.Timers.Timer и System.Threading.Timer .

Однако следует обратить внимание на одну вещь (если вы этого еще не сделали), скажите, если у вас уже есть пространство имен System.Threading в предложении using, но вы действительно хотите использовать таймер в System.Timers, который вам нужен Для этого:

using System.Threading;
using Timer = System.Timers.Timer;

У Джона Скита есть статья о таймерах в его многопоточном руководстве, которую стоит прочитать: http://www.yoda.arachsys.com/csharp/threads/timers.shtml

0 голосов
/ 30 марта 2015

Этот вопрос старый и существующие ответы хорошо охватывают проблему, как это было в то время. Тем временем произошло что-то новое.

Таймер, конечно, для чего?

Использование таймера - это способ запустить некоторую обработку с некоторой задержкой и / или с регулярным интервалом. Есть два случая:

(1) это просто чтобы периодически запускать какой-то короткий код без каких-либо проблем с потоками, без проблем, без проблем. Если простой таймер Windows Forms не подходит, то System.Timers.Timer с его свойством SynchronizingObject делает его более простым, чем System.Threading.Timer.

(2) то, что вы кодируете, находится в области асинхронной параллельной обработки. Это традиционно было подвержено ошибкам, трудно отладить, получить правильную информацию, независимо от того, что использовал простой таймер.

В случае 2 вы можете избежать традиционного подхода, но будьте осторожны, сложность скрывается и готова съесть вас не один раз, а в любое время, когда вы просто не сделаете лучший выбор с совокупными эффектами.

Теперь у нас есть что-то лучше

Если ваша ситуация связана с какой-то обработкой «события» (независимо от того, как она кодируется: нажатия клавиш, кнопки мыши, байты от последовательного порта, от сетевого подключения, от измерений и т. Д.), Вам следует рассмотреть возможность реактивного программирования.

Реактивное программирование в последние годы каким-то образом раскрыло, как кодировать эти ситуации, не попадая в ловушки сложности.

Итак, технически следующая ссылка является ответом на вопрос: это таймер, который находится в пространстве имен System.Reactive.Linq: Observable.Timer Method (System.Reactive.Linq)

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

Поскольку этот вопрос ориентирован на .NET, вас может заинтересовать Хорошее введение в .NET Reactive Framework

Или для ясного, иллюстрированного, более общего (не ориентированного на Microsoft) документа это кажется хорошим Введение в реактивное программирование, которое вы пропустили .

0 голосов
/ 01 августа 2010

Рекомендуется не использовать класс таймера System.Timer.

0 голосов
/ 04 октября 2008

System.Diagnostics.Stopwatch если ваша цель - определить время, необходимое для запуска

...