当前位置:编程学习 > C#/ASP.NET >>

C# 线程中访问statusStrip控件的问题。



在程序中,单独创建一个线程,每秒更新statusStrip1中某一个label的文字,比如:
statusStrip1.toolStripStatusLabel1.Text="现在时间:" + System.DateTime.Now.Date.ToString();

使用中发现一个问题:其它windows控件,在线程中访问时一定要使用Invoke,否则会出错,

但statusStrip1控件却没有Invoke方法,只能使用上面直接访问的方法,

但我测试程序发现偶尔会出现状态栏statusStrip1花掉(打一个X,也不出catch到错误),不能正常显示时间。

请教各位,该怎么弄才不会出错? c# statusStrip --------------------编程问答-------------------- 不一定非得调该控件的Invoke方法,在UI线程的类的Invoke都可以,比如你可以调用Form的Invoke。 --------------------编程问答--------------------
 private delegate void ShowTimeHandler();

        private void Form1_Load(object sender, EventArgs e)
        {
            System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ShowTime));
            t.Start();

        }

        private void ShowTime()
        {
            ShowTimeHandler s = new ShowTimeHandler(ShowTimeFunc);
            this.BeginInvoke(s);
        }

        private void ShowTimeFunc()
        {
            while (true)
            {
               // statusStrip1.toolStripStatusLabel1.Text = "现在时间:" + System.DateTime.Now.Date.ToString();
                try
                {
                    statusStrip1.Items[0].Text = "现在时间:" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    System.Threading.Thread.Sleep(1000);
                    Application.DoEvents();
                }
                catch
                {
                }
            }
        }
--------------------编程问答--------------------
引用 2 楼 gxingmin 的回复:
C# code?12345678910111213141516171819202122232425262728293031 private delegate void ShowTimeHandler();         private void Form1_Load(object sender, EventArgs e)        {            Syst……



感谢要上二位,我用gxingmin的代码测试,界面非常卡,甚至无法操作了。 --------------------编程问答--------------------
引用 3 楼 chris_tan 的回复:
引用 2 楼 gxingmin 的回复:C# code?12345678910111213141516171819202122232425262728293031 private delegate void ShowTimeHandler();         private void Form1_Load(object sender, EventArgs e)     ……



this.BeginInvoke(s) //这句造成界面卡死。 --------------------编程问答--------------------
引用 4 楼 chris_tan 的回复:
引用 3 楼 chris_tan 的回复:引用 2 楼 gxingmin 的回复:C# code?12345678910111213141516171819202122232425262728293031 private delegate void ShowTimeHandler();         private void Form1_Load(object send……

其实你完全没必要用线程,用timer控件就可以了,设置Interval为1000

我的代码我测试了,界面不卡
windows7+vs2012 --------------------编程问答--------------------
引用 5 楼 gxingmin 的回复:
引用 4 楼 chris_tan 的回复:引用 3 楼 chris_tan 的回复:引用 2 楼 gxingmin 的回复:C# code?12345678910111213141516171819202122232425262728293031 private delegate void ShowTimeHandler();         private void F……



说得没得错,我开始确实是用timer的,只是后面不光每秒更新日期,还有其它计算或显示的部份,才单独开了线程,没想到会偶尔出错(机率低,运行24小时可能出一次)。

感谢:) --------------------编程问答--------------------
引用 2 楼 gxingmin 的回复:
C# code?12345678910111213141516171819202122232425262728293031 private delegate void ShowTimeHandler();         private void Form1_Load(object sender, EventArgs e)        {            Syst……

 this.BeginInvoke(s);不是在UI上面执行吗?委托下一个while(true)的循环,这样界面会卡吧?
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,