マルチスレッド・タスク・キューに基づいた時間テストの実行:汎用的なシングル・ケース・モードの実行

3350 ワード

目次
  • マルチスレッドタスクキューに基づいて時間テストを実行する.
  • 1.需要
  • 2.問題
  • 3.解決策
  • 4.具体コード
  • 4.1汎用単例
  • 4.2開始時刻エンティティ
  • 4.3インスタンス化単例
  • 4.4取得タスク終了時間
  • 5.小結
  • 5.1本明細書では、単一のモードの実際の応用における一次着地を提供する.
  • 5.2単一のモードは、グローバルに不変の例に適用される.
  • 5.3汎用実装の一例であり、異なるデータ型の例に適用される.
  • 5.4単一の例は、スレッドにまたがり、メモリレベルで共有できます.


  • マルチスレッド・タスク・キューに基づいた時間テストの実行:汎用的なシングル・ケース・モードの実行


    1.需要


    たとえば、100個のタスクがあり、マルチスレッドが非同期で実行され、すべてのタスクを実行するのにかかる時間を統計します.例えば、開始スレッドがスレッドA、最後のスレッドがBである、BのDataTimeが記録される.Now-AのDataTime.Now.

    2.問題


    ここではマルチスレッド,非同期に関わるため,最後のタスクスレッドで実行が完了したか否かを判断する必要がある.タスクが開始されたスレッドは、同じスレッドに属していないに違いありません.異なるスレッドに伝達変数を記録することに相当します.

    3.解決の考え方


    Aから始まるDateTimeを記録するグローバルな単一例が必要である.Now.次に、Bで現在時刻からAの開始時刻、すなわちメモリレベル向けのタスクキューの実行時間を減算する.

    4.具体コード


    4.1汎用単例


    開始時間はDataTimeタイプであり,以降の単例では様々なタイプが用いられることを考慮して,ここでは汎用型で実現する.
    namespace Singleton
    {
        /**//// 
           ///  
           /// 
           ///  
        public class Singleton where T : new()
        {
            /**//// 
               ///  
               /// 
            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インスタンス化の一例


    メインスレッドでは、6 W個のタスクを呼び出す前に、単一の例をインスタンス化します.
                var _startTime = Singleton.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());
                    _oldQueue.TrySetResult(true);
    
                    _isQueueRunning = false;
                    var TaskTime = DateTime.Now - Convert.ToDateTime(Singleton.Instance.Time);
                    Console.WriteLine("  " + TaskTime);
                }

    5.まとめ


    5.1本明細書では、単一のモードの実際の応用における一次着地を提供する。


    5.2単例モードはグローバル不変の例に適用する。


    5.3汎用的な実装の一例で、異なるデータ型のインスタンスに適用する。


    5.4単一例はスレッド間、メモリレベルで共有できます。