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); // 字段賦值 }
其中,ThreadStart和ParameterizedThreadStart定義委托,均表示在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
參考