基于多執行緒任務佇列執行時間測驗——泛型單例模式落地
目錄
- 基于多執行緒任務佇列執行時間測驗——泛型單例模式落地
- 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
{
/**//// <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 單例可以跨執行緒,記憶體級別共享,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/32481.html
標籤:設計模式
上一篇:AE單詞備忘
下一篇:代理模式
