Здравствуйте, 4erniyPlasch, Вы писали:

P>В догонку... в чем разница между таймерами находящимися в:


P>1. System.Threading

P>2. System.Timers
P>3. System.Windows.Forms

Джеффри Рихтер. CLR via C#. Программирование на платформе Microsoft.NET Framework 2.0 на языке C#:

История трех таймеров

Библиотека FCL поставляется с тремя таймерами, но для большинства программистов остается загадкой, чем они отличаются. Попробую объяснить.

  • Класс Timer из пространства имен System.Threading рассматривался в предыдущем разделе. Он лучше других подходит для выполнения периодических фоновых задач в другом потоке.

    [В CLR есть лишь один поток, используемый для всех объектов Timer, который осведомлен о времени следующего объекта Timer. Когда приходит время следующего объекта Timer, поток CLR пробуждается и вызывает метод QueueUserWorkltem объекта ThreadPool, чтобы добавить запись в очередь пула потоков для вызова метода обратного вызова. Если метод обратного вызова выполняется долго, таймер может сработать опять. Вполне возможна ситуация, в которой один метод обратного вызова выполняется несколькими потоками из пула.

    Будьте внимательны: если метод обращается к совместно используемым данным, лучше добавить блокировки синхронизации потоков, чтобы защитить эти данные от повреждения.]

  • Класс Timer из пространства имен System.Windows.Forms. Создание экземпляра этого класса указывает Windows на необходимость связать таймер с
    вызывающим потоком (см. Win32-функцию SetTimer). Когда таймер срабатывает, Windows добавляет в очередь сообщений потока сообщение таймера (WM_TIMER). Поток должен выполнить прокачку сообщений, чтобы извлечь эти сообщения и передать их нужному методу обратного вызова.

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

  • Класс Timer из пространства имен System.Timers является, по сути, оболочкой для класса Timer из пространства имен System.Threading. Он заставляет CLR по срабатыванию таймера ставить события в очередь пула потоков. Класс System.Timers.Timer происходит от класса Component из пространства имен System.ComponentModel, что позволяет объекты-таймеры размещать в области конструктора форм в Microsoft Visual Studio. Также члены этого класса немного отличаются от других.

    Этот класс был добавлен в FCL давным-давно, когда у Microsoft еще не было четкой концепции потоков и таймеров. Вообще говоря, его стоило бы удалить, чтобы вместо него применялся класс System.Threading.Timer. Я никогда не использую класс System.Timers.Timer и вам не советую, за исключением случаев, когда нужно поместить таймер в область конструктора форм.

  • ... << RSDN@Home 1.2.0 alpha rev. 668>>
    Автор: Odi$$ey    Оценить