强健的鸵鸟 · WARNING: RXTX Version ...· 1 周前 · |
爱喝酒的白开水 · python简单去除视频水印 - 朝阳1 ...· 1 月前 · |
咆哮的爆米花 · 考试纪律 - 学生服务 - 北京大学教务部· 4 月前 · |
谦虚好学的石榴 · 使用pm2+nginx部署koa2(http ...· 10 月前 · |
线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。
线程是 轻量级进程 。一个使用线程的常见实例是现代操作系统中并行编程的实现。使用线程节省了 CPU 周期的浪费,同时提高了应用程序的效率。
到目前为止我们编写的程序是一个单线程作为应用程序的运行实例的单一的过程运行的。但是,这样子应用程序同时只能执行一个任务。为了同时执行多个任务,它可以被划分为更小的线程。
线程生命周期开始于 System.Threading.Thread 类的对象被创建时,结束于线程被终止或完成执行时。
下面列出了线程生命周期中的各种状态:
在 C# 中, System.Threading.Thread 类用于线程的工作。它允许创建并访问多线程应用程序中的单个线程。进程中第一个被执行的线程称为 主线程 。
当 C# 程序开始执行时,主线程自动创建。使用 Thread 类创建的线程被主线程的子线程调用。您可以使用 Thread 类的 CurrentThread 属性访问线程。
下面的程序演示了主线程的执行:
using System ;当上面的代码被编译和执行时,它会产生下列结果:
This is MainThread下表列出了 Thread 类的一些常用的 属性 :
属性描述 CurrentContext获取线程正在其中执行的当前上下文。 CurrentCulture获取或设置当前线程的区域性。 CurrentPrincipal获取或设置线程的当前负责人(对基于角色的安全性而言)。 CurrentThread获取当前正在运行的线程。 CurrentUICulture获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源。 ExecutionContext获取一个 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息。 IsAlive获取一个值,该值指示当前线程的执行状态。 IsBackground获取或设置一个值,该值指示某个线程是否为后台线程。 IsThreadPoolThread获取一个值,该值指示线程是否属于托管线程池。 ManagedThreadId获取当前托管线程的唯一标识符。 Name获取或设置线程的名称。 Priority获取或设置一个值,该值指示线程的调度优先级。 ThreadState获取一个值,该值包含当前线程的状态。下表列出了 Thread 类的一些常用的 方法 :
序号方法名 & 描述 1 public void Abort()线程是通过扩展 Thread 类创建的。扩展的 Thread 类调用 Start() 方法来开始子线程的执行。
下面的程序演示了这个概念:
using System ;当上面的代码被编译和执行时,它会产生下列结果:
In Main: Creating the Child thread Child thread startsThread 类提供了各种管理线程的方法。
下面的实例演示了 sleep() 方法的使用,用于在一个特定的时间暂停线程。
using System ;当上面的代码被编译和执行时,它会产生下列结果:
In Main: Creating the Child thread Child thread starts Child Thread Paused for 5 seconds Child thread resumesAbort() 方法用于销毁线程。
通过抛出 threadabortexception 在运行时中止线程。这个异常不能被捕获,如果有 finally 块,控制会被送至 finally 块。
下面的程序说明了这点:
using System ;当上面的代码被编译和执行时,它会产生下列结果:
In Main: Creating the Child thread Child thread starts In Main: Aborting the Child thread Thread Abort Exception Couldn't catch the Thread Exception线程函数通过委托传递,可以不带参数,也可以带参数(只能有一个参数),可以用一个类或结构体封装参数:
using System; using System.Threading; namespace Test class Program static void Main(string[] args) Thread t1 = new Thread(new ThreadStart(TestMethod)); Thread t2 = new Thread(new ParameterizedThreadStart(TestMethod)); t1.IsBackground = true; t2.IsBackground = true; t1.Start(); t2.Start("hello"); Console.ReadKey(); public static void TestMethod() Console.WriteLine("不带参数的线程函数"); public static void TestMethod(object data) string datastr = data as string; Console.WriteLine("带参数的线程函数,参数为:{0}", datastr);ddwzdd
ddw***@gmail.com
本篇文章的第二段代码创建线程中,在2.0以后可以直接执行子线程,这样一来程序可以省略Main函数中的第一行代码。运行结果一样,似乎程序会更简单易懂点。如下:
using System.Threading.Tasks; using System.Threading; namespace ConsoleApp class Program public static void CallToChildThread() Console.WriteLine("Child thread starts"); static void Main(string[] args) //ThreadStart childref = new ThreadStart(CallToChildThread); Console.WriteLine("In Main: Creating the Child thread"); Thread childThread = new Thread(CallToChildThread); childThread.Start(); Console.ReadKey(); }
WayneGuo
guo***en2008@vip.qq.com
樱花树
100***2797@qq.com
wangtao26-30飞日本
368***607@qq.com
线程函数通过委托传递,可以不带参数,也可以带参数(只能有一个参数),可以用一个类或结构体封装参数:
using System; using System.Threading; namespace Test class Program static void Main(string[] args) Thread t1 = new Thread(new ThreadStart(TestMethod)); Thread t2 = new Thread(new ParameterizedThreadStart(TestMethod)); t1.IsBackground = true; t2.IsBackground = true; t1.Start(); t2.Start("hello"); Console.ReadKey(); public static void TestMethod() Console.WriteLine("不带参数的线程函数"); public static void TestMethod(object data) string datastr = data as string; Console.WriteLine("带参数的线程函数,参数为:{0}", datastr); }
kalimuci
kal***ci@sohu.com
Thread childThread = new Thread( new ThreadStart(CallToChildThread)); Thread childThread = new Thread(CallToChildThread);
经测试上面两种写法是有一点区别的,如果 CallToChildThread 方法没有重载,可以直接用下面的简化写法,如果有重载就需要先用 new ThreadStart 创建线程入口,不然编辑器会报“方法或属性调用不明确”错误。
kalimuci
kal***ci@sohu.com
咆哮的爆米花 · 考试纪律 - 学生服务 - 北京大学教务部 4 月前 |