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);
}