欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-18 19:29:17
基于多线程任务队列执行时间测试——泛型单例模式落地 [toc] 1.需求 比如有100个任务,多线程异步执行,统计执行完所有任务所耗费的时间。如,开始线程是线程A,最后的线程是B,记录B的DataTime.Now A的DataTime.Now. 2.遇到的问题 因为这里涉及到多线程,异步,所以需要在 ......

目录

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

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 单例可以跨线程,内存级别共享。