zoukankan      html  css  js  c++  java
  • C#跨线程操作控件

    1.首先通过按键创建子线程:

    创建子线程,子线程调用changeText方法。

    1      private void btnOK_Click(object sender, EventArgs e)
    2      {
    3         Thread th = new Thread(changeText);
    4         th.Name = "new Thread!";
    5         th.IsBackground = true;
    6         th.Start();
    7      }

    2.子线程操作弹窗提示:

    1      void changeText()
    2      {
    3          Thread.Sleep(3000);
    4          MessageBox.Show("进入子线程:"+Thread.CurrentThread.Name);
    5      }

    效果图:

    3.子线程修改主线程控件

    (1)错误的直接使用:

    1     void changeText()
    2     {
    3         Thread.Sleep(3000);
    4         textBox1.Text = "进入子线程!";
    5     }

    效果图:

    (2)关闭跨线程的检查:

    1       CheckForIllegalCrossThreadCalls = false;

    效果图:

    (3)对跨线程进行检查

    声明委托:

    注:参数类型是object型

    1     public delegate void changeTextHandler(object str);

    按键点击调用方法修改控件:

    注:参数不是在线程创建的时候写入,是在start函数写入!

    1     private void btnOK_Click(object sender, EventArgs e)
    2     {
    3         Thread th = new Thread(changeText);
    4         th.Name = "new Thread!";
    5         th.IsBackground = true;
    6         th.Start("进入子线程!");
    7     }

    修改控件的方法(带一个参数):

     1     void changeText(object str)
     2     {
     3         if (textBox1.InvokeRequired == true)
     4         {
     5              changeTextHandler ct = new changeTextHandler(changeText);   
     6              textBox1.Invoke(ct, new object[] { str });
     7         }
     8         else
     9         {
    10              textBox1.Text = str.ToString();
    11         }
    12     }

    效果图:

    (4)使用MethodInvoker解决跨线程问题

    •   MethodInvoker是无参无返回值;
    •   Action是多参无返回;
    •   Func是多参又返回。
    1      private void btnOK_Click(object sender, EventArgs e)
    2      {
    3          Thread th = new Thread(changeText);
    4          th.Name = "new Thread!";
    5          th.IsBackground = true;
    6          th.Start();
    7      }

    调用对事件的处理方法:

    1     void changeText()
    2     {
    3          Thread.Sleep(3000);
    4          MethodInvoker ln = new MethodInvoker(change);
    5          this.BeginInvoke(ln);
    6     }

    调用对控件的修改方法:

    1         void change()
    2         {
    3             textBox1.Text = "进入子线程!";
    4         }

    效果图:

  • 相关阅读:
    Chrome浏览器二维码生成插件
    《零成本实现Web性能测试:基于Apache JMeter》读书笔记
    《软件性能测试过程详解与案例剖析》读书笔记
    Python-Web-数据库-mongodb
    JAVA并发-基于AQS实现自己的显示锁
    FutureTask原理解析
    Linux上安装jdk,mysql
    Linux常用命令
    函数
    1.初识代码审计-基础
  • 原文地址:https://www.cnblogs.com/imstrive/p/4838262.html
Copyright © 2011-2022 走看看