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





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
Я бы порекомендовал класс 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, если ваша цель - рассчитать время, необходимое для запуска
Это не таймер, он позволяет вам измерять выполнение определенного блока кода, но не действует так же, как таймер.
Рекомендуется не использовать класс таймера 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 Я не понимаю вашего обоснования, вы можете уточнить? Первая часть отвечает на заданный вопрос, так что это реальный ответ. В качестве бонуса вторая часть намекает на другие инструменты, которые могут решить возможный случай знаменитого «XY проблема». Вы имеете в виду, что вторая часть аннулирует весь ответ? Что ты имеешь в виду?
ИМХО. Слишком много слов и ссылок для поддержки другой технологии. Который лучше всего разместить в вопросе «Чем реактивный фреймворк лучше, чем X» или аналогичном. Представьте себе вопрос об А и ответьте: «Не делай А, делай Б». Если вы четко не определили проблему XY (здесь нет, консольное приложение и таймеры полностью в порядке), вы не должны отвечать так через 7 лет после того, как вопрос был задан. Если бы вы упомянули X в комментариях и ответ OP «Выглядит многообещающе, не могли бы вы рассказать мне больше о X и моей проблеме?», То ответ будет более обоснованным (вы можете процитировать комментарий OP в ответе).
Нулевое количество голосов за 5 лет как-то доказывает мою точку зрения, не так ли?
Спасибо @Sinatr. Думаю, теперь я получил ваш первый комментарий. Я согласен с тем, что вторая часть моего ответа как бы «скрывает» / «разбавляет» первую. Первая часть все же добавила кое-что в разговор, где я рекомендую System.Timers.Timer вместо System.Threading.Timer. Этого достаточно, чтобы нажать «Бесполезно»? В любом случае, через 5 лет моя практика StackExchange улучшилась. Думаю, дело улажено, и все мы добиваемся прогресса. Еще раз спасибо за объяснение.
Это действительно ответ на вопрос, но говорит о «минимуме». Ответ ложки намного лучше.