博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#多线程操作Windows Forms控件
阅读量:6190 次
发布时间:2019-06-21

本文共 1455 字,大约阅读时间需要 4 分钟。

在Windows Forms编程中涉及到的多线程操作,多个线程来更新Forms上的控件,比如textbox等。但是如果你直接在线程中更新textbox的text属性是会报错的。因为textbox是主线程创建的,子线程访问的时候就会报错。
 
解决方案如下,建立一个Windows Forms项目,拖拉一个textbox和button就可以。
点击button来启动线程,在线程中修改textbox的值。
这需要使用委托类
//启动线程
private void button1_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(Test));
            thread.Start();
        }
delegate void add();//委托
public void Test()
        {
            this.BeginInvoke(new add(dd));
        }
public void dd();//委托方法
        {
            this.textBox1.Text = "AA";
        }
这样就可以实现。
 
当然委托和委托方法可以再设计一下,可以输入一个参数。修改后的代码如下:
delegate void add(string input);
        private void button1_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(Test));
            thread.Start();
        }
        public void Test()
        {
            this.BeginInvoke(new add(dd),new object[]{"我晕死了,原来这样啊"});//注意第二个参数,委托方法的参数就是在这个地方输入。委托方法中不用转换就直接是字符串了
        }
        public void dd(string input)
        {
            this.textBox1.Text = input;
        }
再附加一个写listbox的例子。就是开启一个线程以后在listbox中写入累加的数字
//声明线程对象
 System.Threading.Thread thread1 = null;
//创建线程并开启
thread1 = new Thread(startThread1);
            thread1.IsBackground = true;
            thread1.Start();
//创建委托对象
delegate void AddList(object o);
//委托用的方法
        public void AddListMethod(object o)
        {
            this.listBox1.Items.Add(o.ToString());
        }
//线程调用的方法
        public void startThread1()
        {
            for (int n = 0; n < 10000; n++)
            {
                this.textBox1.BeginInvoke(new AddList(AddListMethod),new object[]{n});
                System.Threading.Thread.Sleep(100);//这个地方只是为了防止线程运行太快,数字会慢慢在listbox上显示
            }
        }

转载于:https://www.cnblogs.com/lujiangping/p/10630038.html

你可能感兴趣的文章
实战系列之天气预报实时采集
查看>>
反转单链表的几种方法
查看>>
能分析压缩的日志,且基于文件输入的PYTHON代码实现
查看>>
[收藏学习]Openstack中Keystone及dashboard安装参考
查看>>
泸州NGN属南气矿工程----N2000网管系统提示连接数据库失败
查看>>
MySQL不能使用/tmp
查看>>
Android 自定义View 三板斧之三——重写View来实现全新控件
查看>>
模板方法模式----设计模式系列
查看>>
【转】Jmagick的使用例子
查看>>
并发工具类(三)控制并发线程数的Semaphore
查看>>
Redis 介绍2——常见基本类型
查看>>
为什么有时候NSData转换成NSString的时候返回nil
查看>>
js去除空格(转)
查看>>
Object-C---&gt;Swift之(十一)属性观察者
查看>>
LeetCode 34 Search for a Range(搜索范围)
查看>>
Linux制作补丁与打补丁简单用法
查看>>
【Android开发】消息提示框与对话框-使用AlertDialog创建对话框
查看>>
嵌入Groovy
查看>>
深入理解 GraphQL
查看>>
Java设计模式(十二)----享元模式
查看>>