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 @   小项目笔记  阅读(1863)  评论(2编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

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

小项目笔记

点击右上角即可分享
微信分享提示