• 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         }

    效果图:

  • 相关阅读:
    iOS socket编程 第三方库 AsyncSocket(GCDAsyncSocket)
    JS中reduce方法
    程序员的运动建议
    Vuex(三)—— getters,mapGetters,...mapGetters详解
    微信小程序之使用函数防抖与函数节流
    JS 异步(callback→Promise→async/await)
    圈子与网络
    社会经验4
    社会经验3
    爱情(。_。)大忌
  • 原文地址:https://www.cnblogs.com/imstrive/p/4838262.html
Copyright © 2020-2023  润新知