C# 中如何使用Thread

线程是进程中的最小执行单元,多线程是指在给定时间内拥有多个线程的能力,并且可以调度它们从而在某一时刻处理多个操作,微软的 .Net Framework 提供了 Thread 来帮助我们完成多线程开发。

Thread 编程

要想使用 Thread,需要在程序中引用 System.Threading 命名空间,然后再提供一个供线程调度的方法,这个方法是通过 Thread 中的 ThreadStart 委托代理的,下面的代码展示了如何创建线程。

Thread t = new Thread(new ThreadStart(MyThreadMethod));

线程创建好之后,还需要调用 Start 方法去启动,下面的代码展示了如何去实现,哦,对了,上面的 MyThreadMethod方法会在新的线程上被调度,而不是调用线程。

  class Program
  {
    static void Main(string[] args)
    {
      Thread t = new Thread(new ThreadStart(MyThreadMethod));
      t.Start();
      Console.Read();
    }
    static void MyThreadMethod()
    {
      Console.WriteLine("Hello World!");
    }
  }

展示线程状态

一个创建好的线程,它的生命周期内会有多个状态,比如:Aborted, Background, Running, Stopped, Suspended, Unstarted 等等,这些状态在 Thread 中是用 ThreadState 枚举表示的,如下代码所示:

  [Flags]
  public enum ThreadState
  {
    Running = 0,
    StopRequested = 1,
    SuspendRequested = 2,
    Background = 4,
    Unstarted = 8,
    Stopped = 16,
    WaitSleepJoin = 32,
    Suspended = 64,
    AbortRequested = 128,
    Aborted = 256
  }

当一个 Thread 对象创建好之后,它的状态就是 Unstarted,然而当 Start 方法启动之后,线程的状态将会从 Unstarted 切换到 Running 状态,下面的代码展示了这种轮转。

    static void Main(string[] args)
    {
      Thread t = new Thread(new ThreadStart(MyThreadMethod));
      Console.WriteLine("The thread's state is:" + t.ThreadState.ToString());
      t.Start();
      Console.WriteLine("The thread's state is:" + t.ThreadState.ToString());
    }

控制线程的 前台和后台

一个线程要么是前台线程要么是后台线程,如果你是通过显式的方式创建线程,它便是前台线程,前后线程最大的区别在于:应用程序退出的前提必须是程序内的所有前台线程都得到退出,相反,应用程序的退出不依赖于后台线程。

你可以通过 IsBackground 属性来设置 Thread 的前台或者后台,下面的代码展示了如何去实现。

    static void Main(string[] args)
    {
      Thread t = new Thread(new ThreadStart(MyThreadMethod));
      t.Start();
      t.IsBackground = true;
      Console.WriteLine(“The thread's background status is: “+t.IsBackground.ToString());
      Console.Read();
    }

除了启动线程,还可以通过 Suspend() 和 Resume() 方法来 挂起 和 恢复 线程, 值得注意的是,你只能 恢复 你之前通过 Suspend 方法 挂起的线程,如下代码所示:

    static void Main(string[] args)
    {
      Thread t = new Thread(new ThreadStart(MyThreadMethod));
      t.Start();
      t.Suspend(); //Suspends the newly created thread
      t.Resume(); //Resumes the suspended thread
      Console.Read();
    }

值得注意的是,现在的 Thread.Suspend() Thread.Resume() 方法都是被标记成弃用的状态了,取而代之的做法是:使用 AutoResetEventEventWaitHandle 方法来实现多线程之间的同步。

设置线程优先级

可以给一个线程赋予优先级,从而和内存中的其他线程争抢 CPU 时间,在 C# 中是使用 ThreadPriority 枚举来表示,大体上有如下值: Lowest, BelowNormal, Normal, AboveNormal 和 Highest,下面的代码展示了如何给这两个线程赋予优先级。

  class Program
  {
    static void Main(string[] args)
    {
      Thread thread1 = new Thread(new ThreadStart(Method1));
      Thread thread2 = new Thread(new ThreadStart(Method2));

      thread1.Priority = ThreadPriority.Highest;
      thread2.Priority = ThreadPriority.Lowest;

      thread2.Start();
      thread1.Start();

      Console.Read();
    }
    static void Method1()
    {
      for (int i = 0; i < 10; i++)
      {
        Console.WriteLine("First thread: " + i);
      }
    }
    static void Method2()
    {
      for (int i = 0; i < 10; i++)
      {
        Console.WriteLine("Second thread: " + i);
      }
    }
  }

从上面的输出结果中可以看出,Thread1 先于 Thread2 执行完,即使 Thread2.Start 是先启动的,是不是很好的演示了优先级的概念。

线程是昂贵的,因为线程的整个生命周期需要消耗太多的资源,比如:初始化,上下文切换,释放使用的资源 等等,所以在用 多线程 之前需要想好是否真的要这么做,当用多线程的时候,适当的使用 线程池 (ThreadPool) 是一个非常好的做法,毕竟线程池内部会帮你自动创建,释放,调度线程,你只需要傻傻的用即可,同时也是提升程序响应的利器。

译文链接:https://www.infoworld.com/article/3035134/how-to-work-with-threads-in-c.html

以上就是C# 中如何使用Thread的详细内容,更多关于c# 使用 Thread的资料请关注我们其它相关文章!

(0)

相关推荐

  • c#线程Thread示例

    C#是一门支持多线程的语言,因此线程的使用也是比较常见的.由于线程的知识在Win32编程的时候已经说得过多,所以在.Net中很少介绍这部分(可能.Net不觉得这部分是它所特有的). 那么线程相关的问题大致有如下四类(这篇文章只讨论单线程.单线程与UI线程这两方面的问题).问题一,线程的基本操作,例如:暂停.继续.停止等:问题二,如何向线程传递参数或者从中得到其返回值:问题三,如何使线程所占用的CPU不要老是百分之百:最后一个,也是问题最多的,就是如何在子线程来控制UI中的控件,换句话说,就是在线

  • C#多线程之Thread中Thread.IsAlive属性用法分析

    本文实例讲述了C#多线程之Thread中Thread.IsAlive属性用法.分享给大家供大家参考.具体如下: Thread.IsAlive属性 ,表示该线程当前是否为可用状态 如果线程已经启动,并且当前没有任何异常的话,则是true,否则为false Start()后,线程不一定能马上启动起来,也许CPU正在忙其他的事情,但迟早是会启动起来的! Thread oThread = new Thread(new ThreadStart(Back.Start)); oThread.Start();

  • C#利用System.Threading.Thread.Sleep即时输出信息的详解

    有个网站需要生成静态页.据以往经验,凡比较烂的空间,短时间内运行耗能大的运算,都会出现"service unavailable",以致网页无法正常打开.生成静态页,需要在短时间内读取大量的数据并保存为html页,好一些的空间运行起来没问题,就怕那些垃圾空间--生成的时候,需要即时输出信息通知客户. 根据经验思考后,有两种方法可行:1.每次只执行生成一个html页,然后输出信息给客户看,如"已生成首页,正在生成新闻页,请稍候..",然后在输出的代码里放置上js代码,j

  • C#多线程之Thread中Thread.Join()函数用法分析

    本文实例讲述了C#多线程之Thread中Thread.Join()函数用法.分享给大家供大家参考.具体分析如下: Thread.Join()在MSDN中的解释:Blocks the calling thread until a thread terminates 当NewThread调用Join方法的时候,MainThread就被停止执行, 直到NewThread线程执行完毕. Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));

  • C#多线程之Thread类详解

    使用System.Threading.Thread类可以创建和控制线程. 常用的构造函数有: // 摘要: // 初始化 System.Threading.Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托. // // 参数: // start: // System.Threading.ParameterizedThreadStart 委托,它表示此线程开始执行时要调用的方法. // // 异常: // System.ArgumentNullException: // star

  • c# Thread类的用法详解

    Thread类相对于线程池中的线程,使用者有更多的控制权.该类允许创建前台线程,设置线程优先级等.Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数. 1.给线程传递数据 给线程传递数据的两种方式: 1.使用带ParameterizedThreadStart委托参数的Thread构造函数: //定义一个数据类型,传递给线程 public struct Data { public string Message; } //创建一个

  • C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析

    本文实例讲述了C#中Forms.Timer.Timers.Timer.Threading.Timer的用法分析,分享给大家供大家参考.具体分析如下: 在.NET Framework里面提供了三种Timer ① System.Windows.Forms.Timer ② System.Timers.Timer ③ System.Threading.Timer 现分述如下: 一.System.Windows.Forms.Timer 1.基于Windows消息循环,用事件方式触发,在界面线程执行:是使用

  • 详解C#中 Thread,Task,Async/Await,IAsyncResult的那些事儿

    说起异步,Thread,Task,async/await,IAsyncResult 这些东西肯定是绕不开的,今天就来依次聊聊他们 1.线程(Thread) 多线程的意义在于一个应用程序中,有多个执行部分可以同时执行:对于比较耗时的操作(例如io,数据库操作),或者等待响应(如WCF通信)的操作,可以单独开启后台线程来执行,这样主线程就不会阻塞,可以继续往下执行:等到后台线程执行完毕,再通知主线程,然后做出对应操作! 在C#中开启新线程比较简单 static void Main(string[]

  • C#多线程ThreadPool线程池详解

    简单说明一下: 线程池可以看做容纳线程的容器:一个应用程序最多只能有一个线程池:ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相当于请求创建一个线程: 线程池的作用: 1.线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率. 2.如果一个线程的时间非常长,就没必要用线程池了(不是不能作长时间操作,而是不宜.),况且我们还不能控制线程池中线程的开始.挂起.和

  • 浅析Java中Runnable和Thread的区别

    线程的起动并不是简单的调用了你的RUN方法,而是由一个线程调度器来分别调用你的所有线程的RUN方法, 我们普通的RUN方法如果没有执行完是不会返回的,也就是会一直执行下去,这样RUN方法下面的方法就不可能会执行了,可是线程里的RUN方法却不一样,它只有一定的CPU时间,执行过后就给别的线程了,这样反复的把CPU的时间切来切去,因为切换的速度很快,所以我们就感觉是很多线程在同时运行一样. 你简单的调用run方法是没有这样效果的,所以你必须调用Thread类的start方法来启动你的线程.所以你启动

  • 深入剖析Android中Service和Thread区别

    Service既不是进程也不是线程,它们之间的关系如下: 可能有的朋友会问了,既然是长耗时的操作,那么Thread也可以完成啊.没错,在程序里面很多耗时工作我们也可以通过Thread来完成,那么还需要Service干嘛呢.接下来就为大家解释以下Service和Thread的区别. 首先要说明的是,进程是系统最小资源分配单位,而线程是则是最小的执行单位,线程需要的资源通过它所在的进程获取. Service与Thread的区别: Thread:Thread 是程序执行的最小单元,可以用 Thread

  • c++11中关于std::thread的join的详解

    std::thread是c++11新引入的线程标准库,通过其可以方便的编写与平台无关的多线程程序,虽然对比针对平台来定制化多线程库会使性能达到最大,但是会丧失了可移植性,这样对比其他的高级语言,可谓是一个不足.终于在c++11承认多线程的标准,可谓可喜可贺!!! 在使用std::thread的时候,对创建的线程有两种操作:等待/分离,也就是join/detach操作.join()操作是在std::thread t(func)后"某个"合适的地方调用,其作用是回收对应创建的线程的资源,避

  • C# 中如何使用Thread

    线程是进程中的最小执行单元,多线程是指在给定时间内拥有多个线程的能力,并且可以调度它们从而在某一时刻处理多个操作,微软的 .Net Framework 提供了 Thread 来帮助我们完成多线程开发. Thread 编程 要想使用 Thread,需要在程序中引用 System.Threading 命名空间,然后再提供一个供线程调度的方法,这个方法是通过 Thread 中的 ThreadStart 委托代理的,下面的代码展示了如何创建线程. Thread t = new Thread(new Th

  • Android中Handler、Thread、HandlerThread三者的区别

    目录 一.前期知识储备 二.三者的区别 三.HandlerThread的使用 一.前期知识储备 (1)Handler类,上官方文档,Handler public class Handler.A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each Handler instance is associated with a s

  • C#中Backgroundworker与Thread的区别

    目录 1.Backgroundworker 2.Thread 3.总结 最近项目要用到,窗体Form程序要在后台开启几个子线程,负责和其他端进行通信,异步读写,并且来更改UI.在网上查了有Backgroundworker与Thread两种方法. 1.Backgroundworker BackgroundWorker是微软的在.net Framwork中添加的一个组件,主要对线程的访问提供了一种安全的方式.简单的说就是对Thread的一次封装. 首先介绍一下BackgroundWorker的相关属

  • Python中线程threading.Thread的使用详解

    目录 1. 线程的概念 2. threading.thread()的简单使用 2.1 添加线程可以是程序运行更快 2.2 主线程会等待所有的子线程结束后才结束 3.查看线程数量 4.线程参数及顺序 4.1 传递参数的方法 4.2 线程的执行顺序 5. 守护线程 1. 线程的概念 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另外,线程是进程中的一个实体,是被系统独立调度和

  • Java中Runnable和Thread的区别分析

    Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限, 下面看例子: 复制代码 代码如下: package org.thread.demo; class MyThread extends Thread{ private String name; public MyThread(String name) { super(); this.name = name; } publ

  • Java中抓取 Thread Dumps 的方式汇总

    Thread dumps(线程转储)能帮助我们判断 CPU 峰值.死锁.内存异常.应用反应迟钝.响应时间变长和其他系统问题.一些在线的分析工具比如 http://fastthread.io/ 也能帮助我们分析和定位问题,但是这些工具都要求有一个 dump 文件.因此在这篇文章当中,我总结了7中抓取 Java Thread Dumps 文件的方式. 1. jstack jstack 是一个抓取 thread dump 文件的有效的命令行工具,它位于 JDK 目录里的 bin 文件夹下(JDK_HO

  • c#中task与thread区别及其使用的方法示例

    目录 1.什么是thread 2.什么是task 3.创建一个task任务有两种模式: 1.什么是thread 当我们提及多线程的时候会想到thread和threadpool,这都是异步操作,threadpool其实就是thread的集合,具有很多优势,不过在任务多的时候全局队列会存在竞争而消耗资源.thread默认为前台线程,主程序必须等线程跑完才会关闭,而threadpool相反. 总结:threadpool确实比thread性能优,但是两者都没有很好的api区控制,如果线程执行无响应就只能

随机推荐