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

猜你喜欢

转载自blog.csdn.net/qq_38261174/article/details/84938494
今日推荐