年度变更建库软件5.0版本
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 lines
3.3 KiB

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;
///<summary>
///执行回调方法的线程
///</summary>
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);
}
///<summary>
///开启新线程或唤醒线程,去执行回调方法
///</summary>
///<param name="w">用回调方法实例化了的委托实例</param>
///<param name="o">传递给回调方法的参数值</param>
///<param name="isSuspend">true 表示线程为挂起状态,
///false 则表示线程还没创建</param>
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;
}
///<summary>
///线程执行的方法
///</summary>
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();
//}
}
}
}