基於多線程任務隊列執行時間測試——泛型單例模式落地 [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);
}