Сводка по трем таймерам в C#

искусственный интеллект

содержание

Резюме

1. Управление таймером

2. Класс System.Timers.Timer

3. System.Threading.timer класс

Суммировать


Резюме

В настоящее время в .NET существует три вида таймеров:

1. Элемент управления Timer в пространстве имен System.Windows.Forms, которое напрямую наследуется от Component. Элемент управления Timer автоматически отсчитывает время только после привязки события Tick и установки Enabled=True. Остановка времени может контролироваться методом Stop(). После остановки с помощью Stop(), если вы хотите изменить время, вы можете использовать Метод Start() для запуска таймера. Элемент управления Timer и форма, в которой он расположен, принадлежат одному и тому же потоку;

2. Класс Timer в пространстве имен System.Timers. Класс System.Timers.Timer: определите объект System.Timers.Timer, затем привяжите событие Elapsed, запустите отсчет времени с помощью метода Start() и остановите отсчет времени с помощью метода Stop() или Enable=false. Свойство AutoReset устанавливает, следует ли повторять синхронизацию (установите значение false, чтобы выполнить только один раз, установите значение true, чтобы выполнить несколько раз). Привязка прошедшего события эквивалентна открытию другого потока, то есть элементы управления в других потоках не могут быть доступны в событиях, связанных с прошедшим (должны быть определены делегаты, а делегаты вызываются через Invoke для доступа к элементам управления в других потоках).

3, класс System.Threading.Timer. При определении класса инициализируйте его через конструктор.

1. Управление таймером

 

using System;

using System.Windows.Forms;

 

namespace TimerDemo

{

    public partial class FrmMain : Form

    {

// определить глобальную переменную

        public int currentCount = 0;

        public FrmMain()

        {

            InitializeComponent();

        }

        private void FrmMain_Load(object sender, EventArgs e)

        {

//Установим доступность элемента управления Timer

            this.timer.Enabled = true;

//Устанавливаем временной интервал (в миллисекундах)

            this.timer.Interval = 5000;

        }

        private void timer_Tick(object sender, EventArgs e)

        {

            currentCount += 5;

            this.txt_Count.Text = currentCount.ToString().Trim();

        }

        private void btn_Start_Click(object sender, EventArgs e)

        {

// запускаем таймер

            this.timer.Start();

        }

        private void btn_Stop_Click(object sender, EventArgs e)

        {

// остановить отсчет времени

            this.timer.Stop();

        }

    }

}

2. Класс System.Timers.Timer

 

using System;

using System.Windows.Forms;

namespace TimersTimer

{

    public partial class FrmMain : Form

    {

// определяем глобальную переменную

        public int currentCount = 0;

//Определяем класс таймера

        System.Timers.Timer timer;

// определяем делегата

        public delegate void SetControlValue(string value);

        public FrmMain()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            InitTimer();

        }

        /// <summary>

/// Инициализируем элемент управления Timer

        /// </summary>

        private void InitTimer()

        {

//Установить временной интервал (в миллисекундах)

            int interval = 5000;

            timer = new System.Timers.Timer(interval);

//Выполнить однократно (false) или выполнить всегда (true)

            timer.AutoReset = true;

//Устанавливаем, выполнять ли событие System.Timers.Timer.Elapsed

            timer.Enabled = true;

// Привязываем прошедшее событие

            timer.Elapsed += new System.Timers.ElapsedEventHandler(TimerUp);

        }

        /// <summary>

/// Класс Timer выполняет события с привязкой к точке

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void TimerUp(object sender, System.Timers.ElapsedEventArgs e)

        {

            try

            {

                currentCount += 5;

                this.Invoke(new SetControlValue(SetTextBoxText),currentCount.ToString());

            }

            catch (Exception ex)

            {

MessageBox.Show("Не удалось выполнить синхронизированное событие:" + ex.Message);

            }

        }

        /// <summary>

/// Установить значение текстового поля

        /// </summary>

        /// <param name="strValue"></param>

        private void SetTextBoxText(string strValue)

        {

            this.txt_Count.Text = this.currentCount.ToString().Trim();

        }

        private void btn_Start_Click(object sender, EventArgs e)

        {

            timer.Start();

        }

        private void btn_Stop_Click(object sender, EventArgs e)

        {

            timer.Stop();

        }

    }

}

3. Класс System.Threading.Timer

using System;

using System.Threading;

using System.Windows.Forms;

 

namespace Threading.Timer

{

    public partial class FrmMain : Form

    {

// определяем глобальную переменную

        public int currentCount = 0;

//Определяем класс таймера

        System.Threading.Timer threadTimer;

// определяем делегата

        public delegate void SetControlValue(object value);

        public FrmMain()

        {

            InitializeComponent();

        }

        private void FrmMain_Load(object sender, EventArgs e)

        {

            InitTimer();

        }

        /// <summary>

/// Инициализируем класс Timer

        /// </summary>

        private void InitTimer()

        {

            threadTimer = new System.Threading.Timer(new TimerCallback(TimerUp), null, Timeout.Infinite, 1000);

        }

        /// <summary>

/// События, которые выполняются время от времени

        /// </summary>

        /// <param name="value"></param>

        private void TimerUp(object value)

        {

            currentCount += 1;

            this.Invoke(new SetControlValue(SetTextBoxValue), currentCount);

        }

        /// <summary>

/// Присвоить значение текстовому полю

        /// </summary>

        /// <param name="value"></param>

        private void SetTextBoxValue(object value)

        {

            this.txt_Count.Text = value.ToString();

        }

        /// <summary>

/// Начинать

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void btn_Start_Click(object sender, EventArgs e)

        {

//Начнем отсчет времени немедленно, временной интервал составляет 1000 миллисекунд

            threadTimer.Change(0, 1000);

        }

        /// <summary>

/// останавливаться

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void btn_Stop_Click(object sender, EventArgs e)

        {

// остановить отсчет времени

            threadTimer.Change(Timeout.Infinite, 1000);

        }

    }

}

 

Суммировать

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