C# 简单任务池


今天编写一个异步通信框架的,异步派发任务,单路并发,

与直接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(){ 
待执行的任务代码
}));



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值