• Thread线程的使用


    始于 System.Threading.Thread

    ThreadStart  th1 = new ThreadStart(函数调用A方法);

    Thread childThread = new Thread(th1);

     .Start();  开始

    .Start("函数调用A方法的参数");

    .Abort();  结束

    Thread.Sleep(1000);         暂停ms

    Wait    等待

    1. static void Main(string[] args)
    2. {
    3. Thread myThread; //声明线程
    4. //用线程起始点的ThreadStart委托创建该线程的实例
    5. myThread = new Thread(new ThreadStart(createThread));
    6. myThread.Start(); //启动线程
    7. }
    8. public static void createThread()
    9. {
    10. Console.Write("创建线程");
    11. }

    挂起和恢复:

    1. static void Main(string[] args)
    2. {
    3. Thread myThread; //声明线程
    4. //用线程起始点的ThreadStart委托创建该线程的实例
    5. myThread = new Thread(new ThreadStart(createThread));
    6. myThread.Start(); //启动线程
    7. myThread.Suspend(); //挂起线程
    8. myThread.Resume(); //恢复挂起的线程
    9. }
    10. public static void createThread()
    11. {
    12. Console.Write("创建线程");
    13. }

    【1】引用命名空间

    using System.Threading;

    【2】开新线程 

    1. private void btn1_Click(object sender, EventArgs e)
    2. {
    3. Thread thread = new Thread(() =>
    4. {
    5. for (int i = 1; i < 20; i++)
    6. {
    7. Console.WriteLine(i);
    8. Thread.Sleep(1000);
    9. }
    10. });
    11. thread.IsBackground = true;//设置为后台线程
    12. thread.Start();
    13. }

    Thread 构造方法原型:

    1. public Thread(ThreadStart start)
    2. {
    3. if (start == null)
    4. {
    5. throw new ArgumentNullException("start");
    6. }
    7. SetStartHelper(start, 0);
    8. }

     ThreadStart      的类型是委托         void (){.....};

    1. namespace System.Threading
    2. {
    3. [ComVisible(true)]
    4. public delegate void ThreadStart();
    5. }

    构造方法1个参数,参数的类型是委托。

    所以 start变量  传进去的必须是一个方法     无名无参    ()=>{  .....  };

    thread.IsBackground = true;//设置为后台线程
    thread.Start(); //  开始线程

    【3】控件的委托方法   .Invoke( 参数1 , 参数2 );

    1. //通过跨线程给控件赋值
    2. private void btnExecute1_Click(object sender, EventArgs e)
    3. {
    4. Thread thread = new Thread(() =>
    5. {
    6. for (int i = 0; i < 10; i++)
    7. {
    8. // this.lblResult1.Text = i.ToString();
    9. if (this.lblResult1.InvokeRequired)
    10. {
    11. this.lblResult1.Invoke(
    12. new Action<string>(data => { this.lblResult1.Text = data; }),
    13. i.ToString()
    14. );
    15. Thread.Sleep(300);
    16. }
    17. }
    18. });
    19. thread.IsBackground = true;
    20. thread.Start();
    21. }

    这里只要看 this.lblResult1.Invoke( 参数1 , 参数2 );  这句

    1. public object Invoke(Delegate method, params object[] args)
    2. {
    3. using (new MultithreadSafeCallScope())
    4. {
    5. Control control = FindMarshalingControl();
    6. return control.MarshaledInvoke(this, method, args, synchronous: true);
    7. }
    8. }
    9. // args的值 再传给 method的参数中

    第1参数作用是:method变量传方法

    第2参数作用是:把值再传给method方法的参数中

    注:    i.ToString()  再传给  data 

    method委托方法匹配的委托是

    1. namespace System
    2. {
    3. [__DynamicallyInvokable]
    4. public delegate void Action<in T>(T obj);
    5. }

    相当于参数传方法,方法的参数再传参数。

  • 相关阅读:
    centos7 安装 rabbitmq
    16.使用 Dockerfile 定制镜像
    算法leetcode|11. 盛最多水的容器(rust重拳出击)
    springboot萌宠宠物网店的开发与设计 毕业设计-附源码011042
    Javascript知识点详解:正则表达式
    Pytorch 深度学习实践 day01(背景)
    LeetCode——1678.设计 Goal 解析器
    ATFX汇市:非美货币扎堆升值,唯有USDCAD表现平平
    STM8的C语言编程(13)--+蜂鸣器
    2023年9月青少年软件编程(Python) 等级考试试卷(三级)
  • 原文地址:https://blog.csdn.net/cfqq1989/article/details/127784762