C#——跨线程,操作控件

这个问题遇见不止一次,在做通信的时候遇见过。。做卡车调度模拟的时候也遇见过。。。咋解决啊…………

 

错误请看代码:

         private void change()
        {
            this.label1.Text = "已发生变化";
        }
private void button1_Click(object sender, EventArgs e) //按钮事件
        {
            Thread cha = new Thread(new ThreadStart(change));
            cha.Start();
        }

 

解决方法:

private void change()
        {
            this.label1.Text = "已发生变化";
        }
private void threadchange()   //通过委托处理,MSDN上又很详细用法的说明
        {
            MethodInvoker In = new MethodInvoker(change);
            this.BeginInvoke(In);
        }
private void button1_Click(object sender, EventArgs e)
        {
            Thread cha = new Thread(new ThreadStart(threadchange));
            cha.Start();
        }

程序测试成功

上述方法虽然不会弹出跨线程调用控件的错误提示,但是在会导致我自己的程序卡死…………唉!!!

下面还有一种方法,测试成功;

#region  在创建的线程之外对textbox赋值
        delegate void SetTextCallback(object sender); //, EventArgs e);
        void SetText(object sender)//, EventArgs e)
        {
            string text;
            text = ServerMessage.ReceiveMsg;
            if (this.textBoxContent.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                if(orn%2==0)
                    this.textBoxContent.Text += text+"\r\n";
                orn++;
            }
            
        }
        #endregion
View Code
            ServerMessage.msgCome += new msgDialogue.Umsg(SetText);
View Code

上面这句话是添加事件。。。

这样就能解决跨线程调用控件的问题了。可能会遇见这个函数重复执行两次,所以加了一个判断奇偶的语句。

posted @ 2014-09-11 21:52  沙中世界  阅读(138)  评论(0)    收藏  举报