C# - 多線程 之 Process與Thread與ThreadPool

Process

進程類,html

// 提供對本地和遠程進程的訪問,啓動/中止本地系統進程
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]);
}

進程優先級java

// 指示進程優先級
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,  // 單元狀態未指定
}

線程調度優先級ide

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; 

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

參考

相關文章
相關標籤/搜索