zoukankan      html  css  js  c++  java
  • C#异步编程的实现方式(2)——Thread类

    .Net Framework提供了Thread类,它可以创建和控制线程。Thread的构造方法可接受一个无参无返回值的委托类型参数,或一个有object类型参数无返回值的委托类型参数。

    1、简单的Thread类实例

    先创建两个方法,分别用于两个线程处理:

       1: static void ThreadMethod1()
       2: {
       3:     for (int j = 0; j < 20; j++)
       4:     {
       5:         Console.WriteLine("Thread 1 is running");
       6:         Thread.Sleep(500);
       7:     }
       8: }
       9:  
      10: static void ThreadMethod2()
      11: {
      12:     for (int j = 0; j < 20; j++)
      13:     {
      14:         Console.WriteLine("Thread 2 is running");
      15:         Thread.Sleep(500);
      16:     }
      17: }

    两个线程将都是循环20次,每隔500ms输出字符串到控制台。然后在主线程里启动这两个线程:

       1: static void Main(string[] args)
       2: {
       3:     Thread thread1 = new Thread(ThreadMethod1);
       4:     Thread thread2 = new Thread(ThreadMethod2);
       5:  
       6:     thread1.Start();
       7:     thread2.Start();
       8:  
       9:     Console.Read();
      10: }

    可以看到结果是"Thread 1 is running"和"Thread 2 is running"出现,但可能不完全是交替出现,因为两个线程是同时在走,某一个时间点上哪个线程到前台是由操作系统调度的。

    2、线程数据传递

    往线程里传递数据有两种方式。

    (1)ParameterizedThreadStart委托参数

    如果使用ParameterizedThreadStart委托,线程的入口必须有一个object类型参数。这个参数在线程内可以强制转换为任意数据类型。

    先定义一个结构作为输入参数的类型:

       1: struct ThreadData
       2: {
       3:     public string Message;
       4: }

    定义一个方法,在线程里调用:

       1: static void ThreadMethod3(object param)
       2: {
       3:     ThreadData data = (ThreadData)param;
       4:  
       5:     for (int i = 0; i < 20; i++)
       6:     {
       7:         Console.WriteLine(String.Format("Thread 3 is running. Message: {0}", data.Message));
       8:     }
       9: }

    方法里把输入的参数强制转成了ThreadData类型。

    然后在主线程里启动这个线程,用Start方法传入数据:

       1: Thread thread3 = new Thread(ThreadMethod3);
       2: thread3.Start(new ThreadData() { Message = "Hello world!" });

    从结果就可以看到“Hello World!”传入了线程。

    (2)实例方法 
    用上一个例子,定义一个类,其中包含一个数据字段和线程方法:

       1: class Thread4Class
       2: {
       3:     public string Message { get; set; }
       4:  
       5:     public void ThreadMethod4()
       6:     {
       7:         for (int i = 0; i < 20; i++)
       8:         {
       9:             Console.WriteLine(String.Format("Thread 4 is running. Message: {0}", Message));
      10:             Thread.Sleep(500);
      11:         }
      12:     }
      13: }

    然后在主线程里启动:

       1: Thread4Class thread4Class = new Thread4Class() { Message = "Hello world!" };
       2: Thread thread4 = new Thread(thread4Class.ThreadMethod4);
       3: thread4.Start();

    这种方法可以在对线程操作有封装要求的情况下使用。

    3、前台线程与后台线程

    只要有一个前台线程在运行,应用程序的进程就在运行。如果有多个前台线程在运行,尽管Main方法结束了,应用程序进程仍然是激活的,直到所有前台线程结束。最后一个前台线程结束会使所有后台线程一起结束,并且应用程序进程结束。在默认情况下,Thread实例是前台进程,除非在创建Thread实例时设置IsBackground属性为true。

    4、优先级

    前面提到线程的调度由操作系统控制,Thread.Priority属性可以影响调度的顺序。需要注意的是,给线程指定Priority会降低其它线程的运行概率,最好是根据需要,短暂改变优先级。

    Thread类有用法就简要介绍到这,更多关于Thread类的信息,请参阅MSDN。

    参考资料:《C#高级编程》

    http://www.cnblogs.com/sosowjb/archive/2012/08/11/2633230.html

  • 相关阅读:
    Ubuntu 16.04安装迅雷(兼容性不高)
    Ubuntu 16.04安装QQ(不一定成功)
    Ubuntu查看隐藏文件夹的方法
    Ubuntu下非常规方法安装绿色软件(压缩包)
    Ubuntu下常规方法安装软件
    Ubuntu 16.04下截图工具Shutter
    java中 awt Graphics2D
    Vue2.0总结———vue使用过程常见的一些问题
    MySQL 中隔离级别 RC 与 RR 的区别
    DBAplus社群线上分享----Sharding-Sphere之Proxy初探
  • 原文地址:https://www.cnblogs.com/jes_shaw/p/2956011.html
Copyright © 2011-2022 走看看