海纳百川

控件在不同线程中的通信

在.net中,如果在不同的线程中访问控件将会出现错误。例如:

 

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();          
        }


        /// <summary>
        /// Caculate Thread
        /// </summary>
        private void ThreadCaculate(object i)
        {
            SetTB(i.ToString());
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btCaculate_Click(object sender, EventArgs e)
        {
            string i = "Caculating";
            Thread caculateThr = new Thread(new ParameterizedThreadStart(ThreadCaculate));
            caculateThr.Start(i);
        }

 

        /// <summary>
        /// set tbCaculate
        /// </summary>
        /// <param name="i"></param>

        private void SetTB(string i)
        {
            this.tbCaculate.Text = i;
        }
    }

在上面的程序中,我们在ThreadCaculate线程中访问了主线程中的tbCaculate(TextBox控件),因此程序会Cross-thread operation not valid的错误。

解决该问题的方法是使用Invoke方法。该方法有两个个重载方法,Invoke(delegate method),Invoke(delegate method,params object[] args)。

因此我们可以添加一个代理

private delegate void SetTBMethodInvoker(string i);

然后修改SetTB(string i)方法

        private void SetTB(string i)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new SetTBMethodInvoker(SetTB), i);
            }
            else
            {
                this.tbCaculate.Text = i;
            }
        }

从上面可以看出,解决不同线程访问控件的问题分为两步1.创建delegate 2.执行Invoke方法

posted on 2010-04-29 13:34  These days  阅读(265)  评论(1编辑  收藏  举报

导航