zoukankan      html  css  js  c++  java
  • 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 });
            }

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

      

  • 相关阅读:
    win10 安装cmake报错: "Installation directory must be on a local drive"
    python量化笔记16之夏普比率计算公式
    python机器量化之十七:混淆矩阵(confusion_matrix)含义
    使用Aspose.word (Java) 填充word文档数据
    python笔记(十八)机器量化分析—数据采集、预处理与建模
    js 使FORM表单的所有元素不可编辑的示例代码 表
    Web前端面试题:写一个mul函数
    vue + electron 快速入门
    Java新特性stream流
    mycat中间件进行MySQL数据表的水平拆分
  • 原文地址:https://www.cnblogs.com/ysyn/p/2511923.html
Copyright © 2011-2022 走看看