基于多线程任务队列执行时间测试——泛型单例模式落地

2022-10-12,,,,

目录

基于多线程任务队列执行时间测试——泛型单例模式落地

1.需求

比如有100个任务,多线程异步执行,统计执行完所有任务所耗费的时间。如,开始线程是线程a,最后的线程是b,记录b的datatime.now-a的datatime.now.

2.遇到的问题

因为这里涉及到多线程,异步,所以需要在最后一个任务线程判断是否执行完。跟任务开始的线程肯定不属于同一个线程。相当于要在不同线程里记录传递变量。

3.解决思路

需要有个全局的单例来记录a开始的datetime.now。然后在b中取当前时间减去a的开始时间,即为面向内存级别的任务队列的执行时间。

4.具体代码

4.1泛型单例

因为开始时间是datatime类型,而且考虑到以后单例会用到各种类型,所以这里用泛型去实现。

namespace singleton
{
    /**//// <summary>
       /// 泛型实现单例模式
       /// </summary>
       /// <typeparam name="t">需要实现单例的类</typeparam>
    public class singleton<t> where t : new()
    {
        /**//// <summary>
           /// 返回类的实例
           /// </summary>
        public static t instance
        {
            get { return singletoncreator.instance; }
        }

        class singletoncreator
        {
            internal static readonly t instance = new t();
        }
    }
} 

4.2 开始时间实体

starttime.cs

     public class starttime
    {
        private datetime _time;
        public starttime()
        {
            _time = datetime.now;
        }

        public string time
        {
            get { return _time.tostring(); }
        }
    }

4.3 实例化单例

在主线程中,调用6w个任务之前实例化单例。

            var _starttime = singleton<starttime>.instance.time;
            console.writeline("开始时间 " + _starttime );
            for (int i=0;i<=60000;i++){
                int wait=rnd.next(1,10) * 1000;
                var parm=new myparameters{delaytime= 2000, jobno=i};

                obj.queue(futuretask: async ()=>{await runmyjob(parm);  });
            }

4.4 获取任务结束时间

最后一个任务结束时,获取当前时间,再减去单例的任务开始时间即可。

            if (_processingqueue.isempty && _runningtasks.isempty)
            {
                // interlocked.exchange might not be necessary
                var _oldqueue = interlocked.exchange(
                    ref _tscqueue, new taskcompletionsource<bool>());
                _oldqueue.trysetresult(true);

                _isqueuerunning = false;
                var tasktime = datetime.now - convert.todatetime(singleton<starttime>.instance.time);
                console.writeline("任务所用时间 " + tasktime);
            }

5.小结

5.1 本文提供了单例模式实际应用中的一次落地;

5.2 单例模式适用于全局不变的实例;

5.3 泛型实现单例,适用于不同的数据类型实例;

5.4 单例可以跨线程,内存级别共享。

《基于多线程任务队列执行时间测试——泛型单例模式落地.doc》

下载本文的Word格式文档,以方便收藏与打印。