C#多线程操作界面控件的解决方案

转自:C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38

在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常。这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便。
其实解决这个问题有两种方法:

一,是通过设置

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

在你的程序初始化的时候设置了这个属性,而且在你的控件中使用的都是微软Framework类库中的控件的话,系统就不会再抛出你上面所说的这个错误了。

二,就是委托了,个人建议用这种方法
首先在WinForm窗体中拖入TextBox控件,然后参照以下代码:

 public partial class Form1 : Form
    {
        private delegate void ThreadWork(int i);//声明委托类型
        Thread thread;//声明线程变量

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.richTextBox1.Text = "程序开始:\r\n";
            UpdateText();
        }

        public void UpdateText()
        {
            //创建线程CrossThreadFlush
            thread = new Thread(new ThreadStart(CrossThreadFlush));
            thread.IsBackground = true;//后台执行线程
            thread.Start();//启动线程
        }

        private void CrossThreadFlush()
        {
            while (true)
            { //将sleep和无限循环放在等待异步的外面      
                for (int i = 1; i < 100; i++)
                {
                    ThreadFunction(i);//循环体
                    Thread.Sleep(500);
                }
            }
        }

        private void ThreadFunction(int i)
        {
            if (this.richTextBox1.InvokeRequired)//等待异步 
            {
                ThreadWork fc = new ThreadWork(ThreadFunction);
                // this.Invoke(fc);//不带参数调用方法
                //通过代理调用刷新方法//带参数 
                this.Invoke(fc, new object[1] { i });
            }
            else
            {
                this.richTextBox1.Text = string.Format("第{0}个\t{1:mm-ss}\r\n", 
                                        i, DateTime.Now) + this.richTextBox1.Text;
                this.richTextBox1.Refresh();//控件刷新
            }
        }

    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值