using System; using System.Collections.Generic; using System.Threading; namespace Kingo.ThreadManager { public class ProcessManager { public static ProcessManager Instance { get; } = new ProcessManager(); private static readonly object lockObj = new object(); private List ProcessList = new List(); public string WorkerPath { get; set; } private int _MaxThreadNum = -1; public int MaxThreadNum { get { if (_MaxThreadNum == -1) { _MaxThreadNum = Environment.ProcessorCount - 2; } return _MaxThreadNum; } set { _MaxThreadNum = value; } } private ProcessManager() { } public void ExeTask(string pParm, ProcessHandler ProcessCallback = null) { var work = FindWorker(); if (work != null) { try { work.ExeTask(pParm, ProcessCallback); } catch (Exception ex) { } } else { } } public CustomProcess FindWorker() { lock (lockObj) { Thread.Sleep(1000); //移除所有的退出的work ProcessList.RemoveAll(p => p.IsExited); foreach (var item in ProcessList) { if (item.IsExited) { continue; } if (!item.IsBusy) { return item; } } //再移除一次 ProcessList.RemoveAll(p => p.IsExited); if (ProcessList.Count < this.MaxThreadNum) { CustomProcess newWork = new CustomProcess(WorkerPath); ProcessList.Add(newWork); return newWork; } return null; } } } }