简介
进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所须要的资源。一个正在运行的应用程序在操做系统中被视为一个进程,进程能够包括一个或多个线程。线程是操做系统分配处理器时间的基本单元,在进程中能够有多个线程同时执行代码。进程之间是相对独立的,一个进程没法访问另外一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其余进程的运行,Windows系统就是利用进程把工做划分为多个独立的区域的。进程能够理解为一个程序的基本边界。是应用程序的一个运行例程,是应用程序的一次动态执行过程。html
线程(Thread)是进程中的基本执行单元,是操做系统分配CPU时间的基本单位,一个进程能够包含若干个线程,在进程入口执行的第一个线程被视为这个进程的主线程。在.NET应用程序中,都是以Main()方法做为入口的,当调用此方法时系统就会自动建立一个主线程。线程主要是由CPU寄存器、调用栈和线程本地存储器(Thread Local Storage,TLS)组成的。CPU寄存器主要记录当前所执行线程的状态,调用栈主要用于维护线程所调用到的内存与数据,TLS主要用于存放线程的状态信息。缓存
多线程优势:安全
能够同时执行多个计算任务,有可能提升计算机的处理能力,使得计算机每秒能执行愈来愈多的命令多线程
多线程缺点:分布式
(1)线程也是程序,因此线程须要占用内存,线程越多,占用内存也越多。性能
(2)多线程须要协调和管理,因此须要占用CPU时间以便跟踪线程。spa
(3)线程之间对共享资源的访问会相互影响,必须解决争用共享资源的问题。操作系统
(4)线程太多会致使控制太复杂,最终可能形成不少程序缺陷。线程
进程
1 //获取本机全部进程 2 Process[] pro = Process.GetProcesses(); 3 foreach (Process p in pro) 4 { 5 Console.WriteLine(p.ProcessName); 6 }
二、杀死进程:调用Process.Kill()方法code
1 //获取本机全部进程 2 Process[] pro = Process.GetProcesses(); 3 foreach (Process p in pro) 4 { 5 //终止进程 6 p.Kill(); 7 Console.WriteLine(p.ProcessName); 8 }
三、经过进程打开应用程序
1 //经过进程打开应用程序 2 Process.Start("calc"); 3 Process.Start("mspaint"); 4 Process.Start("notepad"); 5 Process.Start("iexplore", "http://www.baidu.com");
四、经过一个进程打开指定的文件
1 ProcessStartInfo psi = new ProcessStartInfo(@"C:\Users\Lenovo\Desktop\html.txt"); 2 Process p = new Process(); 3 p.StartInfo = psi; 4 p.Start();
线程生命周期
线程生命周期开始于 System.Threading.Thread 类的对象被建立时,结束于线程被终止或完成执行时。
下面列出了线程生命周期中的各类状态:
-
未启动状态:当线程实例被建立但 Start 方法未被调用时的情况。
-
就绪状态:当线程准备好运行并等待 CPU 周期时的情况。
-
不可运行状态:下面的几种状况下线程是不可运行的。
-
死亡状态:当线程已完成执行或已停止时的情况。
-
已经调用 Sleep 方法
-
已经调用 Wait 方法
-
经过 I/O 操做阻塞
-
主线程
在 C# 中,System.Threading.Thread 类用于线程的工做。它容许建立并访问多线程应用程序中的单个线程。进程中第一个被执行的线程称为主线程。
当 C# 程序开始执行时,主线程自动建立。使用 Thread 类建立的线程被主线程的子线程调用。可使用 Thread 类的 CurrentThread 属性访问线程。
Thread 类经常使用的属性和方法
下表列出了 Thread 类的一些经常使用的 属性:
属性 | 描述 |
---|---|
CurrentContext | 获取线程正在其中执行的当前上下文。 |
CurrentCulture | 获取或设置当前线程的区域性。 |
CurrentPrinciple | 获取或设置线程的当前负责人(对基于角色的安全性而言)。 |
CurrentThread | 获取当前正在运行的线程。 |
CurrentUICulture | 获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源。 |
ExecutionContext | 获取一个 ExecutionContext 对象,该对象包含有关当前线程的各类上下文的信息。 |
IsAlive | 获取一个值,该值指示当前线程的执行状态。 |
IsBackground | 获取或设置一个值,该值指示某个线程是否为后台线程。 |
IsThreadPoolThread | 获取一个值,该值指示线程是否属于托管线程池。 |
ManagedThreadId | 获取当前托管线程的惟一标识符。 |
Name | 获取或设置线程的名称。 |
Priority | 获取或设置一个值,该值指示线程的调度优先级。 |
ThreadState | 获取一个值,该值包含当前线程的状态。 |
下表列出了 Thread 类的一些经常使用的 方法:
序号 | 方法名 & 描述 |
---|---|
1 | public void Abort() 在调用此方法的线程上引起 ThreadAbortException,以开始终止此线程的过程。调用此方法一般会终止线程。 |
2 | public static LocalDataStoreSlot AllocateDataSlot() 在全部的线程上分配未命名的数据槽。为了得到更好的性能,请改用以 ThreadStaticAttribute 属性标记的字段。 |
3 | public static LocalDataStoreSlot AllocateNamedDataSlot( string name) 在全部线程上分配已命名的数据槽。为了得到更好的性能,请改用以 ThreadStaticAttribute 属性标记的字段。 |
4 | public static void BeginCriticalRegion() 通知主机执行将要进入一个代码区域,在该代码区域内线程停止或未经处理的异常的影响可能会危害应用程序域中的其余任务。 |
5 | public static void BeginThreadAffinity() 通知主机托管代码将要执行依赖于当前物理操做系统线程的标识的指令。 |
6 | public static void EndCriticalRegion() 通知主机执行将要进入一个代码区域,在该代码区域内线程停止或未经处理的异常仅影响当前任务。 |
7 | public static void EndThreadAffinity() 通知主机托管代码已执行完依赖于当前物理操做系统线程的标识的指令。 |
8 | public static void FreeNamedDataSlot(string name) 为进程中的全部线程消除名称与槽之间的关联。为了得到更好的性能,请改用以 ThreadStaticAttribute 属性标记的字段。 |
9 | public static Object GetData( LocalDataStoreSlot slot ) 在当前线程的当前域中从当前线程上指定的槽中检索值。为了得到更好的性能,请改用以 ThreadStaticAttribute 属性标记的字段。 |
10 | public static AppDomain GetDomain() 返回当前线程正在其中运行的当前域。 |
11 | public static AppDomain GetDomainID() 返回惟一的应用程序域标识符。 |
12 | public static LocalDataStoreSlot GetNamedDataSlot( string name ) 查找已命名的数据槽。为了得到更好的性能,请改用以 ThreadStaticAttribute 属性标记的字段。 |
13 | public void Interrupt() 中断处于 WaitSleepJoin 线程状态的线程。 |
14 | public void Join() 在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止为止。此方法有不一样的重载形式。 |
15 | public static void MemoryBarrier() 按以下方式同步内存存取:执行当前线程的处理器在对指令从新排序时,不能采用先执行 MemoryBarrier 调用以后的内存存取,再执行 MemoryBarrier 调用以前的内存存取的方式。 |
16 | public static void ResetAbort() 取消为当前线程请求的 Abort。 |
17 | public static void SetData( LocalDataStoreSlot slot, Object data ) 在当前正在运行的线程上为此线程的当前域在指定槽中设置数据。为了得到更好的性能,请改用以 ThreadStaticAttribute 属性标记的字段。 |
18 | public void Start() 开始一个线程。 |
19 | public static void Sleep( int millisecondsTimeout ) 让线程暂停一段时间。 |
20 | public static void SpinWait( int iterations ) 致使线程等待由 iterations 参数定义的时间量。 |
21 | public static byte VolatileRead( ref byte address ) public static double VolatileRead( ref double address ) public static int VolatileRead( ref int address ) public static Object VolatileRead( ref Object address ) 读取字段值。不管处理器的数目或处理器缓存的状态如何,该值都是由计算机的任何处理器写入的最新值。此方法有不一样的重载形式。这里只给出了一些形式。 |
22 | public static void VolatileWrite( ref byte address, byte value ) public static void VolatileWrite( ref double address, double value ) public static void VolatileWrite( ref int address, int value ) public static void VolatileWrite( ref Object address, Object value ) 当即向字段写入一个值,以使该值对计算机中的全部处理器均可见。此方法有不一样的重载形式。这里只给出了一些形式。 |
23 | public static bool Yield() 致使调用线程执行准备好在当前处理器上运行的另外一个线程。由操做系统选择要执行的线程。 |
24 | public void Suspend();(慎用) 挂起线程,或者若是线程已挂起,则不起做用。 |
25 | public void Resume();(慎用) 继续已挂起的线程。 |
线程优先级
成员名称 |
说明 |
---|---|
Lowest |
能够将 Thread 安排在具备任何其余优先级的线程以后。 |
BelowNormal |
能够将 Thread 安排在具备 Normal 优先级的线程以后,在具备 Lowest 优先级的线程以前。 |
Normal |
默认选择。能够将 Thread 安排在具备 AboveNormal 优先级的线程以后,在具备 BelowNormal 优先级的线程以前。 |
AboveNormal |
能够将 Thread 安排在具备 Highest 优先级的线程以后,在具备 Normal 优先级的线程以前。 |
Highest |
能够将 Thread 安排在具备任何其余优先级的线程以前。 |
线程示例
static void Main(string[] args) { //获取正在运行的线程 Thread thread = Thread.CurrentThread; //设置线程的名字 thread.Name = "主线程"; //获取当前线程的惟一标识符 int id = thread.ManagedThreadId; //获取当前线程的状态 ThreadState state= thread.ThreadState; //获取当前线程的优先级 ThreadPriority priority= thread.Priority; string strMsg = string.Format("Thread ID:{0}\n" + "Thread Name:{1}\n" + "Thread State:{2}\n" + "Thread Priority:{3}\n", id, thread.Name, state, priority); Console.WriteLine(strMsg); Console.ReadKey(); }
运行结果: