Подтвердить что ты не робот

Есть ли класс таймера в С#, который не находится в пространстве имен Windows.Forms?

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

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

4b9b3361

Ответ 2

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

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.

Ответ 3

Есть, по крайней мере, System.Timers.Timer и System.Threading.Timer, о которых я знаю.

Если вы еще не сделали этого, обратите внимание на то, что, если вы еще этого не сделали раньше, скажите, если у вас уже есть пространство имен System.Threading в вашем объявлении, но вы действительно хотите использовать таймер в System.Timers вам нужно для этого:

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

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

Ответ 4

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 5

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

Ответ 6

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