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

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

      

  • 相关阅读:
    mysql 查看存储过程 并导出
    mysql 添加记录或者删除记录
    mysql 修改表的字段
    搭建docker私有仓库
    安装gitlab并配置邮箱
    Mac 安装MySQL-python
    android studio 调试安装
    给定日期求星期几
    数字三角形
    程序设计实训-课程表管理系统项目中遇到的问题
  • 原文地址:https://www.cnblogs.com/ysyn/p/2511923.html
Copyright © 2020-2023  润新知