c#跨线程调用控件、函数的问题

     今天在论坛上面看到一个lz的关于c#的问题,运行出现错误。上网搜了答案,又看看自己的积累,本质的原因是:c#的跨线程调用控件的问题。经过一番查找,同时根据自己的资料,现总结如下:

 1、系统自带委托(不带参数的控件调用)

    //MethodInvoker 类型是一个系统定义的委托,用于调用不带参数的方法。

        private Thread thread;



        private void button1_Click(object sender, EventArgs e)

        {

            thread = new Thread(new ThreadStart(Runthread));

            thread.Start();

        }



        private void Runthread()

        {

            MethodInvoker me = new MethodInvoker(SetLabelText);

            BeginInvoke(me);

        }



        private void SetLabelText()

        {

            label1.Text = "调用窗体控件";

        }


2、自定义委托调用

    第一种情况:带参数

        private Thread thread;

        private delegate void setLabelText(string str);



        private void button1_Click(object sender, EventArgs e)

        {

            thread = new Thread(new ThreadStart(Runthread));

            thread.Start();

        }



        private void Runthread()

        {

            string ss = "直接调用";

            if (this.label1.InvokeRequired)

            {

                setLabelText sl = new setLabelText(SetLabel);

                this.Invoke(sl, new object[] { ss });

            }

            else

                this.label1.Text = "调用";

        }



        private void SetLabel(string s)

        {

            label1.Text = s;

        }

    第二种情况:不带参数

View Code
        Thread th1, th2;

        double x1, x2;



        public delegate void SetControl();

        private void button1_Click(object sender, EventArgs e)

        {

            th1 = new Thread(new ThreadStart(fangfa1));

            th2 = new Thread(new ThreadStart(fangfa2));

            th1.Start();

            th2.Start();



        }

        private void fangfa1()

        {

            if (label1.InvokeRequired)

            {

                label1.BeginInvoke(new SetControl(fangfa1));

                return;

            }

            for (int i = 0; i < 50; i++)

            {

                x1 = i * 2;

                label1.Text += x1.ToString();

            }

        }  

    

        private void fangfa2()

        {

            if (label2.InvokeRequired)

            {

                label2.BeginInvoke(new SetControl(fangfa2));

                return;

            }

            for (int i = 0; i < 50; i++)

            {

                x2 = i + 2;

                label2.Text += x2.ToString();

            }

        }

 

 3、以上就是跨线程对控件的调用,以下是本人在日常中用到的一个方法,不知道是不是对本标题的进一步解释,但感觉很有用就和大家分享下。

大致意思是在其它class类中往Form1中richTexbox中添加内容,意思和本标题有所接近吧,废话少说,代码如下:

View Code
       private delegate void setRichTexBox(string str);



        private void button1_Click(object sender, EventArgs e)

        {

            setText("richTextBox添加内容:");

            //这里是在控件中直接向richTextBox1添加内容。如果你想在其他的类中向richTextBox1中添加内容,直接调用setText函数就可以了

        }



        public void setText(string s)

        {

            if (this.richTextBox1.InvokeRequired)

            {

                setRichTexBox fc = new setRichTexBox(Set);

                this.Invoke(fc, new object[] { s });

            }

            else

                this.richTextBox1.AppendText(s);

        }



        private void Set(string txt)

        {

            richTextBox1.AppendText(txt);

        }

 

在Form2中调用Form1中的函数:

View Code
      //以下代码是在Form2中



        public Form1 myForm1;



        public delegate void Addmsg(string txt);

        public void Msg(string txt)

        {

            myForm1.AddRevMsg(txt);

                               //AddRevMsg(txt)是Form1中的函数

        }



        public void Diaoyong(string str)

        {

            Addmsg myAddmsg = new Addmsg(Msg);

            myForm1.BeginInvoke(myAddmsg, new object[] { str });

        }

 

第一次写博客,有错误和不足之处,还希望大家多多指教,谢谢阅读。

 

  

你可能感兴趣的:(C#)