none
多執行緒大量資料傳送namepipe問題..透過LOCK將資料先存入ArrayList再送出...想讓系統更有效率 RRS feed

  • 一般討論

  • 請教各位前輩

    因為小弟寫了個service程式

    但要把資料show在UI上面,所以想說試試看用NAMEPIPE來溝通

    像我在實測時

    我大概有24萬筆的資料..用100個執行緒快速的要交給NAMEPIPE來送...(24萬筆資料約5分鐘內產生)

    這時我只想到先存到ArrayList 容器內.

    再由一個執行緒裡面跑while (true)去檢查容器內是否有資料待送..有的話就一筆一筆透過NAMEPIPE送出(送一筆刪一筆)

    因為想說讓系統更穩定

    這種LOCK方式應該會影響整體速度,不知道有沒有前輩能推薦更適合的方式呢?有沒有推薦的非同步的方式將資料塞入容器內在讀取

    或是service傳資料給ui介面,不需要用到namepipe這種溝通方式@@

    還是也不需要容器..直接Write namepipe就好他自己會做執行緒安全

    因為我發現好像ArrayList 累積到20萬筆,突然卡卡的好像就很慢才送資料給ui

            ArrayList akeys = new ArrayList();
            private void SendOrDel(string strEvent, bool IsDel)
            {
                try
                {
                    lock(obj)
                    {
                            if (IsDel)
                            {
                                akeys.Remove(strEvent);
                            }
                            else
                            {
                                akeys.Add(strEvent);
                            }
                    }
                }
                catch (Exception ex)
                {
                }
            }

    2017年5月5日 上午 09:47

所有回覆

  • 需要執行緒安全可以考慮使用Thread-Safe Collections
    2017年5月5日 下午 10:21
  • 首先,有一個問題,你是要準備一次性的,把24萬筆資料,顯示在UI上?

    通常或正常來說,把1000到2000筆資料,一次性的全部顯示在UI上,已經是很差的UI或程式設計了。其實你可以分段,把每一定數量的資料,慢慢的分批,從Database傳到去Client,已經足夠了。

    1) 用正常的ADO.NET去抓data,不要用LINQ to SQL (因為它是屬於 ORM,多了一層,Performance會慢一點)

    2) 重新設計好你的database tables

    3) 用Stored Procedure

    4) 如何有效的把data 分段

    -------

    如果只看你另一個問題,

    發現好像ArrayList 累積到20萬筆,突然卡卡的好像就很慢

    最差情況就是全部20萬筆,都加進了ArrayList,看到你只是加了string進去,那可以建議你,用 foreach 和 stringbuilder。

    -------

    因為不知道你為什麼要一次的全部24萬筆資料都顯示在UI上,也不知道你的code其他地方,很難能夠準確幫忙改良。


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.

    2017年5月8日 上午 01:59
  • 首先,有一個問題,你是要準備一次性的,把24萬筆資料,顯示在UI上?

    通常或正常來說,把1000到2000筆資料,一次性的全部顯示在UI上,已經是很差的UI或程式設計了。其實你可以分段,把每一定數量的資料,慢慢的分批,從Database傳到去Client,已經足夠了。

    1) 用正常的ADO.NET去抓data,不要用LINQ to SQL (因為它是屬於 ORM,多了一層,Performance會慢一點)

    2) 重新設計好你的database tables

    3) 用Stored Procedure

    4) 如何有效的把data 分段

    -------

    如果只看你另一個問題,

    發現好像ArrayList 累積到20萬筆,突然卡卡的好像就很慢

    最差情況就是全部20萬筆,都加進了ArrayList,看到你只是加了string進去,那可以建議你,用 foreach 和 stringbuilder。

    -------

    因為不知道你為什麼要一次的全部24萬筆資料都顯示在UI上,也不知道你的code其他地方,很難能夠準確幫忙改良。


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.

    可以當作小弟的程式是類似Wireshark,單純把網路上設備訊號封包收集起來準備顯示,所以還是逃不過"接收","回應"這兩種訊

    24萬筆是刻意去量測才會出現的筆數XD,平時不會這樣啦...

    雖說是24萬筆訊號,但我不會24萬筆都記錄在UI上面,UI大概顯示100筆就會被我清空。

    應該是說等同600台電腦,對一隻Service程式做通訊,但這隻Service程式必須把通訊內容透過NAMEPIPE傳到UI

    2017年5月12日 上午 02:59
  • Queue<T> 處理先進先出可能比較適合。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2017年5月13日 下午 03:28
    版主