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 });
        }

 

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

 

  

posted @ 2012-05-21 17:18  小项目笔记  阅读(1838)  评论(2编辑  收藏  举报

更多文章请关注公众号:小项目笔记

小项目笔记