目錄多線程
好比有100個任務,多線程異步執行,統計執行完全部任務所耗費的時間。如,開始線程是線程A,最後的線程是B,記錄B的DataTime.Now-A的DataTime.Now.異步
由於這裏涉及到多線程,異步,因此須要在最後一個任務線程判斷是否執行完。跟任務開始的線程確定不屬於同一個線程。至關於要在不一樣線程裏記錄傳遞變量。async
須要有個全局的單例來記錄A開始的DateTime.Now。而後在B中取當前時間減去A的開始時間,即爲面向內存級別的任務隊列的執行時間。測試
由於開始時間是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(); } } }
startTime.cs線程
public class StartTime { private DateTime _time; public StartTime() { _time = DateTime.Now; } public string Time { get { return _time.ToString(); } } }
在主線程中,調用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); }); }
最後一個任務結束時,獲取當前時間,再減去單例的任務開始時間便可。隊列
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); }