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

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

1.需求

好比有100個任務,多線程異步執行,統計執行完全部任務所耗費的時間。如,開始線程是線程A,最後的線程是B,記錄B的DataTime.Now-A的DataTime.Now.異步

2.遇到的問題

由於這裏涉及到多線程,異步,因此須要在最後一個任務線程判斷是否執行完。跟任務開始的線程確定不屬於同一個線程。至關於要在不一樣線程裏記錄傳遞變量。async

3.解決思路

須要有個全局的單例來記錄A開始的DateTime.Now。而後在B中取當前時間減去A的開始時間,即爲面向內存級別的任務隊列的執行時間。測試

4.具體代碼

4.1泛型單例

由於開始時間是DataTime類型,並且考慮到之後單例會用到各類類型,因此這裏用泛型去實現。spa

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個任務以前實例化單例。code

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

相關文章
相關標籤/搜索