В чем разница между таймерами?
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 25.01.07 06:02
Оценка: 2 (1)
#Имя: FAQ.dotnet.timers
Здравствуйте, 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>>
    Windows.Forms.Timer
    От: 4erniyPlasch Россия  
    Дата: 26.06.06 12:01
    Оценка:
    На форме есть таймер, который должен срабатывать раз в 2 минуты:

       Me.TimerRefresh.Enabled = True
       Me.TimerRefresh.Interval = 2*60*1000


    Вот лог его срабатывания:


    Почему таймер иногда по 2 раза срабатывает? И вообще...может ли он 2 раза срабатывать?

    PS: процессор вообще не занят, программа между срабатыванием таймера ничего не далает.
    Windows.Forms.Timer
    От: Аноним  
    Дата: 26.06.06 12:07
    Оценка:
    Может у вас эта ситуация:
    http://blogs.msdn.com/bclteam/archive/2006/04/24/580064.aspx

    Здесь правда другой тип таймера. Но смысла не меняет
    SUNETA Мой блог


    данное сообщение получено с www.gotdotnet.ru
    ссылка на оригинальное сообщение
    Re: Windows.Forms.Timer
    От: 4erniyPlasch Россия  
    Дата: 26.06.06 12:08
    Оценка:
    В догонку... в чем разница между таймерами находящимися в:


    ???
    Re: Windows.Forms.Timer
    От: Аноним  
    Дата: 26.06.06 12:14
    Оценка:
    Из MSDN:

    System.Threading.Timer is a simple, lightweight timer that uses callback methods and is served by threadpool threads. You might also consider System.Windows.Forms.Timer for use with Windows forms, and System.Timers.Timer for server-based timer functionality. These timers use events and have additional features.

    Ну и:

    Timers are lightweight objects that enable you to specify a delegate to be called at a specified time. A thread in the thread pool performs the wait operation.
    Using the Timer class is straightforward. You create a Timer, passing a TimerCallback delegate to the callback method, an object representing state that will be passed to the callback, an initial raise time, and a time representing the period between callback invocations. To cancel a pending timer, call the Timer.Dispose function.
    Note
    There are two other timer classes. The System.Windows.Forms.Timer class is a control that works with visual designers and is meant to be used in user interface contexts; it raises events on the user interface thread. The System.Timers.Timer class derives from Component, so it can be used with visual designers; it also raises events, but it raises them on a ThreadPool thread. The System.Threading.Timer class makes callbacks on a ThreadPool thread and does not use the event model at all. It also provides a state object to the callback method, which the other timers do not. It is extremely lightweight.
    SUNETA Мой блог


    данное сообщение получено с www.gotdotnet.ru
    ссылка на оригинальное сообщение
    Re: Windows.Forms.Timer
    От: 4erniyPlasch Россия  
    Дата: 26.06.06 12:53
    Оценка:
    Здравствуйте, k_savelev, Вы писали:

    _>Может у вас эта ситуация:

    _>http://blogs.msdn.com/bclteam/archive/2006/04/24/580064.aspx
    _>Здесь правда другой тип таймера. Но смысла не меняет

    Здесь все с точностью до наоборот. У меня события наоборот срабатывает чаще чем должно по идее.
    Re[2]: Windows.Forms.Timer
    От: _FRED_ Черногория
    Дата: 26.06.06 12:59
    Оценка:
    Здравствуйте, 4erniyPlasch, Вы писали:

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

    P>???

    Comparing the Timer Classes in the .NET Framework Class Library
    Help will always be given at Hogwarts to those who ask for it.
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.