• 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控件,任何控件

  • 相关阅读:
    DS博客作业04--图
    DS博客作业03--树
    DS博客作业02--栈和队列
    DS博客作业01--线性表
    C博客作业05--指针
    C语言博客作业04--数组
    C博客作业03--函数
    博客作业——循环结构
    C博客作业05-指针
    C博客作业04--数组
  • 原文地址:https://www.cnblogs.com/zjypp/p/2319423.html
Copyright © 2020-2023  润新知