using System; using System.Threading; namespace Kingo.ThreadManager { public delegate void TaskParameterCallback(object obj); public delegate void TaskCallback(TaskParameter parm); public class CustomThread { ManualResetEvent _event = new ManualResetEvent(true); ManualResetEvent _PoolEvent = null; public bool IsActive = false; public bool IsSuspend = false; private TaskInfo Task; //线程 private Thread t; //委托,这里直接用 .NET 框架自带的, //也可以根据需要自己定义一个 private TaskCallback w; private TaskCallback c; //传递给符合委托的回调方法的参数值, //根据委托的定义而定 private TaskParameter o; /// ///执行回调方法的线程 /// public Thread CurrThread { get { return t; } } public CustomThread(ManualResetEvent pPoolEvent) { _PoolEvent = pPoolEvent; //线程还没有创建,创建一个新线程,并执行 t = new Thread(new ThreadStart(this.ThreadProc)); t.IsBackground = true; t.SetApartmentState(ApartmentState.MTA); } /// ///开启新线程或唤醒线程,去执行回调方法 /// ///用回调方法实例化了的委托实例 ///传递给回调方法的参数值 ///true 表示线程为挂起状态, ///false 则表示线程还没创建 public void Start(TaskInfo pTask) { this.Task = pTask; this.Task.IsWait = false; //开启新线程或唤醒线程前,先设置 this.w = pTask.ExeFun; this.o = pTask.Parameter; this.c = pTask.ExeComplatFun; //线程为挂起状态,唤醒线程继续执行 //if (IsSuspend) //{ // //t.Resume(); // _event.Set(); // IsSuspend = false; //} //else //{ t.Start(); //} //IsActive = true; Task.IsWait = false; } /// ///线程执行的方法 /// private void ThreadProc() { //死循环,使线程唤醒后不是退出,而是继续通过委托执行回调方法 //while (true) //{ try { //通过委托执行回调方法 //_event.WaitOne(); w(o); if (c != null) { lock (c) { c?.Invoke(o); //IsActive = false; } } //_event.Reset(); //IsSuspend = true; //IsActive = false; } catch (Exception ex) { throw; }finally { IsActive = false; Task.IsComplete = true; _PoolEvent?.Set(); } //t.Suspend(); //} } } }