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

来源:https://www.cnblogs.com/JerryMouseLi/archive/2019/12/13/12034441.html
-Advertisement-
Play Games

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

5.小結

5.1 本文提供了單例模式實際應用中的一次落地;

5.2 單例模式適用於全局不變的實例;

5.3 泛型實現單例,適用於不同的數據類型實例;

5.4 單例可以跨線程,記憶體級別共用。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • part6 課程介紹 scroll系列: 重點,每個屬性是什麼意思 封裝scroll系列的相關的屬性,固定導航欄案例 事件瀏覽器的滾動條事件--能夠寫出來 封裝動畫函數 緩動動畫 變速動畫 筋斗雲 獲取元素計算後的樣式屬性值 升級變速動畫 理解 能夠自己寫出最終版本的函數 手風琴案例 開機動畫案例 ...
  • 案例:圖標跟著滑鼠飛(有bug) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>title</title> <style> img { position: absolute; } </style> </he ...
  • 關於post和get傳遞參數的區別 今天一朋友給我一段代碼,說使用request.querystrin得不到傳過來的值,我們一起找到很長時間,終於給找到了,錯誤的原因是他將form中的method參數寫成了get了,所以使用request.querystrin得不到值,改成post就解決了。現在列出 ...
  • 案例:完整的輪播圖 思路: 分5部分做 1. 獲取所有要用的元素 2. 做小按鈕,點擊移動圖標部分 3. 做右邊焦點按鈕,點擊移動圖片,小按鈕顏色一起跟著變 (克隆了第一圖到第六圖,用索引liObj.setAttribute("index", i),pic = this.getAttribute(" ...
  • Number() 轉換數值,String() 轉換字元串,Boolean() 轉換布爾值。 JavaScript 數據類型 JavaScript 中有五種可包含值的數據類型: 字元串(string) 數字(number) 布爾(boolean) 對象(object) 函數(function) 有三種 ...
  • break 語句“跳出”迴圈。 continue 語句“跳過”迴圈中的一個迭代。 Break 語句 在本教程稍早的章節中,您已見到了 break 語句。它被用於“跳出” switch 語句。 break 語句也可用於跳出迴圈。 break 語句會中斷迴圈,並繼續執行迴圈之後的代碼(如果有): 實例 ...
  • 只要條件為 true,迴圈能夠一直執行代碼塊。 While 迴圈 while 迴圈會一直迴圈代碼塊,只要指定的條件為 true。 語法 while (條件) { 要執行的代碼塊 } 實例 在下麵的例子中,迴圈中的代碼將運行,一遍又一遍,只要變數(i)小於 10: while (i < 10) { t ...
  • 首先,描述一下我的業務場景及項目分層結構,非標準DDD(其實我不覺得有標準),只是思考的時候有帶入DDD思想。 業務場景:這是一個ERP系統對中台提供的介面項目,倉儲操作大多都是存儲過程去完成的。 項目結構,如圖: WebAPI層:這個不用多說了,入口。 DTO層:增加數據傳入傳出對象,和領域mod ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...