跨线程访问可视化控件(方法一)

来源:互联网 发布:越狱用什么软件好 编辑:程序博客网 时间:2024/05/14 19:21

问题:由于可视化控件是由主线程创建,.NET中规定“不能跨线程直接访问可视化控件”。

跨线程访问可视化控件方法一:利用Control类提供的Invoke()方法,其定义为:

public Object Invoke(Delegate method)

实施步骤:

(1)定义一个访问控件的函数

(2)根据所定义的函数类型自定义一个对应的委托

(3)申明一个委托类型的字段,并与访问控件的函数挂接

(4)编写一个线程函数,在该函数中调用控件对象的Invoke()方法,并将委托字段作为Invoke方法的参数

(5)创建并启动线程

实例(以Label控件为例)

  

代码实现:

public partial class Form1 : Form
    {
        //申明一个不带参数的委托
        private delegate void setLabelTextDelegate1();
        private static setLabelTextDelegate1 setText1;
        //申明带有一个参数的委托
        private delegate void setLabelTextDelegate2(string strText);
        private static setLabelTextDelegate2 setText2;

        public Form1()
        {
            InitializeComponent();
            //将函数与对应委托挂接
            setText1 = setLableText1;
            setText2 = setLableText2;
        }
        /// <summary>
        /// 不带参数的setLableText函数
        /// </summary>
        private void setLableText1()
        {
            label1.Text = "跨线程访问label控件";
        }
        /// <summary>
        /// 不带参数的线程函数
        /// </summary>
        private void ThreadMethod1()
        {
            label1.Invoke(setText1);
        }
        /// <summary>
        /// 带一个参数的setLableText函数
        /// </summary>
        /// <param name="strText"></param>
        private void setLableText2(string strText)
        {
            label1.Text = strText;
        }
        /// <summary>
        /// 带一个参数的线程函数
        /// </summary>
        /// <param name="obj"></param>
        private void ThreadMethod2(object obj)
        {
            label1.Invoke(setText2, new object[] { obj.ToString()});
        }
        /// <summary>
        /// 调用无参数的线程函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_VisitLable1_Click(object sender, EventArgs e)
        {
            Thread th1 = new Thread(new ThreadStart(ThreadMethod1));
            th1.Start();
        }
        /// <summary>
        /// 调用有参数的线程函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_VisitLable2_Click(object sender, EventArgs e)
        {
            Thread th2 = new Thread(new ParameterizedThreadStart(ThreadMethod2));
            th2.Start(tb_infomation.Text);
        }

原创粉丝点击