首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

.NET 定時器使用實例詳解(二):System.Timers.Timer 與 System.Threading.Timer 多執行緒定時器委派跨執行緒 UI 更新

     編輯:關於C語言

System.Timers.Timer:伺服器型定時器

  • 多執行緒,不依賴 UI 執行緒。
  • 無法直接操作 UI 控制項,需設定 SynchronizingObject = this 或使用委派 Invoke。
public partial class Form1 : Form
{
    System.Timers.Timer t;
    delegate void BindDataSourceCallback(DataSet ds);

    private void Form1_Load(object sender, EventArgs e)
    {
        t = new System.Timers.Timer();
        t.Interval = 2000;
        t.Enabled = true;
        t.Elapsed += timersTimer_Elapsed;
        t.Start();
    }

    private void timersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        DataSet ds = new DataSet();
        using (var sda = new SqlDataAdapter("select * from sysobjects order by newid()", "server=.;uid=sa;pwd=sa;database=master;"))
            sda.Fill(ds);

        this.Invoke(new BindDataSourceCallback(bindData), ds);
    }

    private void bindData(DataSet ds)
    {
        dataGridView1.DataSource = ds.Tables[0].DefaultView;
        dataGridView1.Refresh();
    }
}

System.Threading.Timer:執行緒池定時器

  • 輕量級,使用執行緒池,同樣需委派跨執行緒更新 UI。
  • 建構函式:new TimerCallback(callback), state, dueTime, period。
System.Threading.Timer t;
private void Form1_Load(object sender, EventArgs e)
{
    t = new System.Threading.Timer(
        new TimerCallback(timersTimer_Elapsed), null, 0, 2000);
}

private void timersTimer_Elapsed(object state)
{
    // 相同資料存取與 Invoke 邏輯
    this.Invoke(new BindDataSourceCallback(bindData), ds);
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved