基於多線程任務隊列執行時間測試——泛型單例模式落地


基於多線程任務隊列執行時間測試——泛型單例模式落地

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 單例可以跨線程,內存級別共享。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM