首页  ·  知识 ·  编程语言
c#多线程操作WindowsForms控件
网友    .NET  编辑:dezai   图片来源:网络
在Windows Forms编程中涉及到的多线程操作,多个线程来更新Forms上的控件,比如textbox等。但是如果你直接在线程中更新textbox的text属性是会报错的。因为textbo
在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上显示
            }
        }
 
本文作者:网友 来源:网络
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读