1. 程式人生 > >C#:定時器的使用。及 執行緒間的跳轉

C#:定時器的使用。及 執行緒間的跳轉

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