今天编写一个异步通信框架的,异步派发任务,单路并发,
与直接INVOKE相比的好处是可以使任务的执行代价根据时间均匀化,
请看代码
public class ServiceTask
{
public ServiceTask(Action action)
{
_action = action;
}
private Action _action;
public void Execute()
{
_action.Invoke();
}
}
public class ServiceTaskPool
{
private static int TaskExecuteInterval = 100;
public static ServiceTaskPool Instance { get { return Nested.instance; } }
public void Add(ServiceTask task)
{
lock (this)
{
Tasks.Enqueue(task);
}
}
private class Nested
{
static Nested() { }
internal static readonly ServiceTaskPool instance = new ServiceTaskPool();
}
private void TaskPostThread()
{
while (true)
{
lock (this)
{
if (Tasks.Count > 0)
{
ServiceTask t = Tasks.Dequeue();
t.Execute();
}
}
Thread.Sleep(TaskExecuteInterval);
}
}
private Queue<ServiceTask> Tasks = new Queue<ServiceTask>();
private Thread thread;
private ServiceTaskPool()
{
thread = new Thread(TaskPostThread);
thread.Start();
}
~ServiceTaskPool()
{
thread.Abort();
foreach (var t in Tasks)
{
t.Execute();
}
}
}
调用方法也很简单
ServiceTaskPool.Instance.Add(new ServiceTask((Action)delegate(){
待执行的任务代码
}));