Process

进程类

// 提供对本地和远程进程的访问,启动/停止本地系统进程
public class Process : Component {
public int Id { get; } // 系统生成的进程唯一标识符
public string ProcessName { get; } // 进程名称
public string MachineName { get; } // 运行进程的计算机名称
public ProcessThreadCollection Threads { get; } // 进程关联的线程集合(System.Diagnostics.ProcessThread类型的数组)
public ProcessModule MainModule { get; } // 进程主模块
public ProcessModuleCollection Modules { get; } // 进程加载的模块集合(System.Diagnostics.ProcessModule类型的数组)
public DateTime StartTime { get; } // 进程启动时间
public DateTime ExitTime { get; } // 进程退出时间
public int ExitCode { get; } // 进程终止时指定的代码值
public bool HasExited { get; } // 进程是否已终止
public TimeSpan TotalProcessorTime { get; } // 进程的总的处理器时间
public TimeSpan UserProcessorTime { get; } // 进程的用户处理器时间
public TimeSpan PrivilegedProcessorTime { get; } // 进程的特权处理器时间
public ProcessPriorityClass PriorityClass { get; set; } // 进程的总体优先级别类别
public int BasePriority { get; } // 进程的基本优先级别,由PriorityClass计算
public IntPtr Handle { get; } // 进程的本机句柄(进程启动时OS为进程分配的句柄,用来跟踪进程属性)
public int HandleCount { get; } // 进程打开的操作系统句柄数
public int WorkingSet { get; } // 进程当前使用的物理内存总量
public int PrivateMemorySize { get; } // 为进程分配的专用内存字节数
public int VirtualMemorySize { get; } // 进程的虚拟内存大小
public bool Responding { get; } // 进程的用户界面当前是否响应系统
public int SessionId { get; } // 进程的终端服务会话标识符 public Process();
// System.IO.StreamReader/StreamWriter
public StreamReader StandardError { get; } // 用于读取应用程序的标准错误流
public StreamWriter StandardInput { get; } // 用于写入应用程序的标准输入流
public StreamReader StandardOutput { get; } // 用于读取应用程序的标准输出流
public bool Start([string fileName]); // 启动进程
public bool Start(ProcessStartInfo startInfo);
public void Kill(); // 停止进程
public void Close(); // 关闭进程,释放与此组件关联的所有资源
public void Refresh(); // 放弃进程的、已缓存到该进程组件内的任何信息
protected override void Dispose(bool disposing); // 释放进程使用的所有资源
public bool WaitForExit([int milliseconds]); // 等待进程退出
// 获取新的System.Diagnostics.Process组件并与当前活动的进程关联
public static Process GetCurrentProcess();
// 获取[指定计算机上]运行的所有进程资源
public static Process[] GetProcesses([string machineName]);
// 获取[指定计算机上]由ProcessID对应的进程
public static Process GetProcessById(int processId [, string machineName]);
// 获取[指定计算机上]由ProcessName对应的进程
public static Process[] GetProcessesByName(string processName [, string machineName]);
}

进程优先级

// 指示进程优先级
public enum ProcessPriorityClass {
Idle = 64, // 指定进程的线程只能在系统空闲时运行
BelowNormal = 16384,
Normal = 32, // 指定进程没有特殊的安排需求
AboveNormal = 32768,
High = 128, // 指定进程执行必须立即执行的时间关键任务
RealTime = 256, // 可能的最高优先级
}

进程优先级与进程的每个线程的优先级值一起确定其每个线程的基本优先级别。

其他进程相关

// 进程路径信息
string startup-Path = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
或 System.Reflection.Assembly.GetExecutingAssembly().Location;
// 进程目录信息
string startup-Directory = System.IO.Path.GetDirectoryName(startupPath);
或 System.IO.Directory.GetCurrentDirectory();
或 System.Environment.CurrentDirectory;
或 System.Windows.Forms.Application.StartupPath; 

Thread

线程类,.NET中的CLR线程可看作是对操作系统线程的封装,CLR线程与操作系统线程对应,Thread类的实例在调用start()方法后,CLR才会创建一个操作系统线程与之绑定。CLR线程池限制线程的创建速度不超过2个/秒。

属性方法 

// 创建并控制线程,设置其优先级并获取其状态
public sealed class Thread : CriticalFinalizerObject, _Thread {
public int ManagedThreadId { get; } // 托管线程的唯一标识符
public string Name { get; set; }
public bool IsAlive { get; } // 当前线程的执行状态(true:线程已启动且尚未正常终止或中止)
public bool IsBackground { get; set; }
public bool IsThreadPoolThread { get; }
public static Thread CurrentThread { get; } // 获取当前正在运行的线程
public static Context CurrentContext { get; } // 获取当前线程的上下文
public ExecutionContext ExecutionContext { get; } // 管理当前线程的上下文
public ApartmentState ApartmentState { get; set; } // 线程的单元状态
public ThreadPriority Priority { get; set; }
public ThreadState ThreadState { get; } // 指定线程启动时要调用的委托方法,(指定线程的最大堆栈大小)
public Thread(ParameterizedThreadStart start [, int maxStackSize]);
public Thread(ThreadStart start [, int maxStackSize]);
public override int GetHashCode(); // 当前线程的哈希代码
public static int GetDomainID(); // 唯一的应用程序域标识符
public static AppDomain GetDomain(); // 当前线程正在其中运行的当前应用程序域
public ApartmentState GetApartmentState();
public void SetApartmentState(ApartmentState state); // 启动前设置线程的单元状态
public bool TrySetApartmentState(ApartmentState state);
public void Start([object parameter]); // 启动线程(->Running)
public void Suspend(); // 挂起线程
public void Resume(); // 继续已挂起的线程
public void Interrupt(); // 中断处于WaitSleepJoin状态的线程
public void Join(); // 阻塞调用线程,直到某个线程终止为止
public void Abort([object stateInfo]); // 终止线程(引发ThreadAbortException、开始终止线程的过程)
public static void ResetAbort(); // 取消为当前线程请求的Abort(System.Object)
public static void Sleep(); // 阻塞线程
public static void SpinWait(int iterations); // 线程等待(iterations定义等待时间)
public static bool Yield(); // true:操作系统选择并转而执行另一个线程 public static LocalDataStoreSlot AllocateNamedDataSlot(string name);
public static LocalDataStoreSlot GetNamedDataSlot(string name);
public static void FreeNamedDataSlot([string name]);
public static object GetData(LocalDataStoreSlot slot);
public static void SetData(LocalDataStoreSlot slot, object data);
public static Type VolatileRead(ref Type address); // 读取字段值
public static void VolatileWrite(ref Type address, Type value); // 字段赋值
} 

其中,ThreadStartParameterizedThreadStart定义委托,均表示在System.Threading.Thread上要执行的方法:

public delegate void ThreadStart();
public delegate void ParameterizedThreadStart(object obj);

其中,ApartmentState指定System.Threading.Thread的单元状态

public enum ApartmentState {
STA = 0, // System.Threading.Thread将创建并进入一个单线程单元
MTA = 1, // System.Threading.Thread将创建并进入一个多线程单元
Unknown = 2, // 单元状态未指定
}

线程调度优先级

public enum ThreadPriority {
Lowest = 0,
BelowNormal = 1,
Normal = 2, // 默认优先级
AboveNormal = 3,
Highest = 4,
} 

线程生命周期

线程执行状态 

public enum ThreadState {
Running = 0, // 线程已启动,它未被阻塞且没有挂起的System.Threading.ThreadAbortException
StopRequested = 1, // 正在请求线程停止(仅用于内部)
SuspendRequested = 2, // 正在请求线程挂起
Background = 4, // 线程正作为后台线程执行
Unstarted = 8, // 尚未对线程调用Start()方法、线程未启动
Stopped = 16, // 线程已停止
WaitSleepJoin = 32, // 线程已被阻止
Suspended = 64, // 线程已挂起
AbortRequested = 128, // 已对线程调用Abort(System.Object)方法,但线程尚未收到System.Threading.ThreadAbortException试图终止它的挂起
Aborted = 256, // 线程状态包括AbortRequested且该线程已死,但其状态尚未更改为Stopped
}

其中,ThreadState.WaitSleepJoin状态的可能原因:

  • 调用Sleep(System.Int32)方法或Join()方法;
  • 请求锁定:调用Monitor.Enter(System.Object)方法或Monitor.Wait(System.Object,System.Int32,System.Boolean)方法;
  • 等待线程同步对象:ManualResetEvent或AutoResetEvent;

多线程读写变量

private int ConnectionCount = 0; //当前连接数
Interlocked.Decrement(ref ConnectionCount);
Interlocked.Increment(ref ConnectionCount);
Thread.VolatileRead(ref ConnectionCount)

ThreadPool

线程池,由系统维护的容纳线程的容器,一个应用程序最多只能有一个线程池。ThreadPool适于并发运行若干个运行时间不长且互不干扰的函数,通过复用有限个固定线程为大量操作服务,减少创建和销毁线程的代价、提高效率。托管线程池中的线程默认为后台线程,即线程的IsBackground属性为true,意味着所有前台线程退出后,ThreadPool线程不会让应用程序保持运行。

  • 不能控制线程池中线程的开始、挂起、和中止;
  • 不适应于执行时间比较长的线程;

// 提供一个线程池,该线程池可用于发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器
public static class ThreadPool{
// 将工作函数排入线程池(,同时指定工作函数需要的参数)
// 每排入一个工作函数,相当于请求创建一个线程,当线程池中有线程可用时、执行工作函数
public static bool QueueUserWorkItem(WaitCallback callBack);
public static bool QueueUserWorkItem(WaitCallback callBack, object state);
// 设置线程池维护的最小空闲线程数
public static bool SetMinThreads(int workerThreads, int completionPortThreads);
// 设置线程池中可同时处于活动状态的线程数目,大于此数目的请求将保持排队状态,直到有线程变为可用
public static bool SetMaxThreads(int workerThreads, int completionPortThreads);
// 检索当前线程池维护的空闲线程的最小数目
public static void GetMinThreads(out int workerThreads, out int completionPortThreads);
// 检索当前线程池维护可同时处于活动状态的的线程的最大数目
public static void GetMaxThreads(out int workerThreads, out int completionPortThreads);
// 获取当前可用的线程数(= GetMaxThreads - 当前线程池中活动的线程数)
public static void GetAvailableThreads(out int workerThreads, out int completionPortThreads);
}

其中,WaitCallback表示线程池线程要执行的回调方法:

public delegate void WaitCallback(object state);

以工作中QC框架中的一段代码示例:

 

其他线程池

ManagedThreadPool

由Stephen Toub完全用C#托管代码实现的线程池,quite excellent pool

SmartThreadPool

智能线程池,开源线程池组件,用SmartThreadPool可以简单实现支持多线程的程序,线程池来管理线程、可以减少死锁的出现,同时支持简单的生产者-消费者模式。

  • 下载SmartThreadPool:http://smartthreadpool.codeplex.com/
  • 引用SmartThreadPool.dll

参考

C# - 多线程 之 Process与Thread与ThreadPool的更多相关文章

  1. C#多线程编程介绍——使用thread、threadpool、timer

    C#多线程编程介绍——使用thread.threadpool.timer 在system.threading 命名空间提供一些使得能进行多线程编程的类和接口,其中线程的创建有以下三种方法:thread ...

  2. 多线程-Thread和ThreadPool

    多线程原理 多线程都是基于委托的. 多线程优缺点 缺点: 1.导致程序复杂,开发调试维护困难,特别是线程交互. 2.线程过多导致服务器卡死,因为占用CPU 内存等资源. 优点: 1.良好的交互,特别对 ...

  3. 多线程异步编程示例和实践-Thread和ThreadPool

    说到多线程异步编程,总会说起Thread.ThreadPool.Task.TPL这一系列的技术.总结整理了一版编程示例和实践,分享给大家. 先从Thread和ThreadPool说起: 1. 创建并启 ...

  4. NET 异步多线程,THREAD,THREADPOOL,TASK,PARALLEL

    .NET 异步多线程,THREAD,THREADPOOL,TASK,PARALLEL,异常处理,线程取消 今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主 ...

  5. C#异步和多线程以及Thread、ThreadPool、Task区别和使用方法

    本文的目的是为了让大家了解什么是异步?什么是多线程?如何实现多线程?对于当前C#当中三种实现多线程的方法如何实现和使用?什么情景下选用哪一技术更好? 第一部分主要介绍在C#中异步(async/awai ...

  6. process vs thread

    process vs thread http://blog.csdn.net/mishifangxiangdefeng/article/details/7588727 6.进程与线程的区别:系统调度是 ...

  7. 线程(Thread,ThreadPool)、Task、Parallel

    线程(Thread.ThreadPool) 线程的定义我想大家都有所了解,这里我就不再复述了.我这里主要介绍.NET Framework中的线程(Thread.ThreadPool). .NET Fr ...

  8. .net 多线程的使用(Thread)

    上篇 net 同步异步 中篇 多线程的使用(Thread) 下篇 net 任务工厂实现异步多线程 Thread多线程概述 上一篇我们介绍了net 的同步与异步,我们异步演示的时候使用的是委托多线程来实 ...

  9. Thread和ThreadPool

    Thread和ThreadPool 说到多线程异步编程,总会说起Thread.ThreadPool.Task.TPL这一系列的技术.总结整理了一版编程示例和实践,分享给大家. 先从Thread和Thr ...

随机推荐

  1. MFC中如何画带实心箭头的直线

    工作中遇到话流程图的项目,需要画带箭头的直线,经过摸索,解决:思路如下: (1) 两个点(p1,p2)确定一个直线,以直线的一个端点(假设p2)为原点,设定一个角度 (2)以P2为原点得到向量P2P1 ...

  2. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  3. java 利用ManagementFactory获取jvm,os的一些信息--转

    原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...

  4. 卸载oracle之后,如何清除注册表

    之前卸载了oracle,今天偶然间发现,在服务和应用程序里面,还残存着之前的oracle服务.原来,还需要去清理下注册表. 在开始菜单的这个框里面 输入regedit,进入注册表.找到这个目录 HKE ...

  5. 【JS基础】正则表达式

    正则表达式的() [] {}有不同的意思. () 是为了提取匹配的字符串.表达式中有几个()就有几个相应的匹配字符串. (\s*)表示连续空格的字符串. []是定义匹配的字符范围.比如 [a-zA-Z ...

  6. SharePoint2016安装的过程的”Microsoft.SharePoint.Upgrade.SPUpgradeException”错误解决方法

    前提 在windows server 2012的服务器上运行安装sharepoint2016出现如下错误: Could not load file or assembly ‘Microsoft.Dat ...

  7. Android—基于微信开放平台v3SDK,开发微信支付填坑。

    接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束 ...

  8. MyBatis3.2从入门到精通第一章

    第一章一.引言mybatis是一个持久层框架,是apache下的顶级项目.mybatis托管到goolecode下,再后来托管到github下.(百度百科有解释)二.概述mybatis让程序将主要精力 ...

  9. WPF - 属性系统 (4 of 4)

    依赖项属性的重写 在基于C#的编程中,对属性的重写常常是一种行之有效的解决方案:在基类所提供的属性访问符实现不能满足当前要求的时候,我们就需要重新定义属性的访问符. 但对于依赖项属性而言,属性执行逻辑 ...

  10. AngularJS 第三天----作用域

    作用域的概念及其功能 AngularJS使用作用域的概念来充当数据模型的作用,在视图和控制器之间起着桥梁的作用.由于双向绑定的数据特性,视图的修改会更新 $scope,同样对 $scope的修改也会重 ...