C#:定時器的使用。及 執行緒間的跳轉
阿新 • • 發佈:2018-12-10
1.程式功能介紹
一開始在窗體form1中,點選按鈕button1,textlable標籤顯示“等待2s,跳轉到窗體2”,之後便隱藏窗體1,顯示窗體2.
2.實現思路及程式碼
在點選事件中有:
①顯示文字
②Thread.Sleep(2000);
③等待2秒結束,跳轉到窗體2
但是上面的Sleep()有可能會阻塞執行緒,導致顯示文字不能完全顯示,便已經跳到了窗體2.
所以不能用Sleep(),我們改用定時器。
程式碼如下:
namespace WindowsFormsApp13 { public partial class Form1 : Form { //當前執行緒的上下文 static SynchronizationContext synt; //執行緒切換,非同步執行要用到 public Form1() { synt = SynchronizationContext.Current; //不能在申明時初始化 InitializeComponent(); //初始化元件 } private void button1_Click(object sender, EventArgs e) { this.result.Text = "等待2s,跳轉到窗體2"; //不用Sleep(),用定時器 //2秒的定時器定時器 System.Timers.Timer t = new System.Timers.Timer(2000); //達到2秒間隔時發生的事件 t.Elapsed += new System.Timers.ElapsedEventHandler(tiaoZ); //執行tiaoZ()方法,進行窗體跳轉 t.AutoReset = false; //只執行一次,不迴圈定時 t.Enabled = true; //定時器可用 } //兩個引數必須有,不然會報錯。可用快捷鍵生成該方法 private void tiaoZ(object sender, ElapsedEventArgs e) { //不能直接像下面這樣進行UI操作,因為該方法是線上程當中。需要通過執行緒切換 //this.Hide(); //new Form2().Show(); //切換到context申明的執行緒,非同步執行 //第一個引數可以直接傳入方法名,第二個引數為傳遞的引數,不用則為Null synt.Post(new SendOrPostCallback(real),null); } private void real(object state) { //在UI執行緒中,可進行UI操作 this.Hide(); new Form2().Show(); } } }