Есть ли в C# класс таймера, которого нет в пространстве имен Windows.Forms?

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
18
0
22 167
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

Это действительно ответ на вопрос, но говорит о «минимуме». Ответ ложки намного лучше.

OJ. 04.10.2008 03:49

Я бы порекомендовал класс 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.

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

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

Eric Schoonover 04.10.2008 03:55

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

Мне известны как минимум классы 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

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

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

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

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

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

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

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

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

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

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

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

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

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

Комментарий со ссылкой на введение в реактивный фреймворк лучше подойдет в качестве подсказки для OP / будущих читателей, чем такой ответ.

Sinatr 04.08.2020 13:23

@Sinatr Я не понимаю вашего обоснования, вы можете уточнить? Первая часть отвечает на заданный вопрос, так что это реальный ответ. В качестве бонуса вторая часть намекает на другие инструменты, которые могут решить возможный случай знаменитого «XY проблема». Вы имеете в виду, что вторая часть аннулирует весь ответ? Что ты имеешь в виду?

Stéphane Gourichon 07.08.2020 23:55

ИМХО. Слишком много слов и ссылок для поддержки другой технологии. Который лучше всего разместить в вопросе «Чем реактивный фреймворк лучше, чем X» или аналогичном. Представьте себе вопрос об А и ответьте: «Не делай А, делай Б». Если вы четко не определили проблему XY (здесь нет, консольное приложение и таймеры полностью в порядке), вы не должны отвечать так через 7 лет после того, как вопрос был задан. Если бы вы упомянули X в комментариях и ответ OP «Выглядит многообещающе, не могли бы вы рассказать мне больше о X и моей проблеме?», То ответ будет более обоснованным (вы можете процитировать комментарий OP в ответе).

Sinatr 10.08.2020 10:07

Нулевое количество голосов за 5 лет как-то доказывает мою точку зрения, не так ли?

Sinatr 10.08.2020 10:10

Спасибо @Sinatr. Думаю, теперь я получил ваш первый комментарий. Я согласен с тем, что вторая часть моего ответа как бы «скрывает» / «разбавляет» первую. Первая часть все же добавила кое-что в разговор, где я рекомендую System.Timers.Timer вместо System.Threading.Timer. Этого достаточно, чтобы нажать «Бесполезно»? В любом случае, через 5 лет моя практика StackExchange улучшилась. Думаю, дело улажено, и все мы добиваемся прогресса. Еще раз спасибо за объяснение.

Stéphane Gourichon 11.08.2020 11:58

Другие вопросы по теме