zoukankan      html  css  js  c++  java
  • c#多线程操作Windows Forms控件

    c#多线程操作Windows Forms控件

    在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上显示
                }
            }

    -----------------------------------------

    或者采用 更简单的方式

    Control.CheckForIllegalCrossThreadCalls = false;

    control可以使windowFrom控件,任何控件

  • 相关阅读:
    ext DateTime.js在ie下显示不全
    js 获得每周周日到周一日期
    近十年one-to-one最短路算法研究整理【转】
    虚函数(实现多态)
    函数调用机制2
    函数调用机制
    面向对象的三大特性
    矩阵类c++实现
    矩阵求逆c++实现
    解决文件大小上传限制
  • 原文地址:https://www.cnblogs.com/zjypp/p/2319423.html
Copyright © 2011-2022 走看看