none
定時更新數據,運作一段時間CPU%標高程式當掉 RRS feed

  • 問題

  • 我是剛開始學習C#程式開法的小菜鳥,想詢問一些效能的問題

    這個問提讓我困擾了一個禮拜,我做了一隻想要即時更新數據的程式分成3個Page,撈取的資料放在TextBox裡面使用的語法如下:

                    cc = Regex.Match(textBox1.Text, "(.*)</div></div></td><td data-table=(.*) class=rate-content-cash text-right print_hide>(.*)</td><td data-table=(.*) class=rate-content-cash text-right print_hide>(.*)</td><td data-table=(.*)class=rate-content-sight text-right print_hide data-hide=phone>(.*)</td><td data-table=(.*) class=rate-content-sight text-right print_hide data-hide=phone>(.*)</td><td data-table=(.*)");
    


    剛開始以為是這段程式碼導致程式當掉,所以我使用多線呈執行續,把他分開來,可是狀況依然在,然後我想是不是每次更新的元件出了問題

    一開始我使用的語法是這樣

    timer1.Tick += new EventHandler(button1_Click_1); timer1.Enabled = true;

    ●進入button1_Click_1後關掉Timer

    timer1.Enabled = false;

    ●XXXXXXX(運作內容)在執行下一個Button

    timer2.Tick += new EventHandler(button2_Click);
                timer2.Enabled = true;

    使用這樣無限巡迴程式運作一段時間就開始出狀況,程式沒有回應了

    後來我想到是不是換個方式

    timer1.Tick += new EventHandler(button1_Click); timer2.Tick += new EventHandler(button2_Click); timer3.Tick += new EventHandler(button3_Click); timer1.Enabled = true; timer3.Enabled = true; timer2.Enabled = true; timer2.Stop(); timer3.Stop();

    ●進入第一個Button

    timer1.Interval = 10000;
                timer1.Stop();

    xxxxxxxxxxx(運作內容)

    timer2.Start();

    後來成功了!!!!,原來問題是出在這裡,雖然我到現在還是不太清楚原因,不過有成功把問題改善,不知後續是否會出問題呢??

    2018年11月25日 上午 02:40

解答

  • 因為 code 不太齊, 看了好幾次後, 發現可能有個小問題。

    你是不是在 button1_Click_1 這個 method 裡有寫
    timer2.Tick += new EventHandler(button2_Click);

    而每次 Timer1 的 Tick 被發動的時候, 他就會執行 button_Click_1 method ?

    如果這樣, timer2 的 Tick event 會不斷地加入對 button2_Click Method 的參考, 也就是當 timer2 的 Tick 被發動的時候, 會執行越來多越多次的 button2_Click method, 所以就會一直飆高 CPU。

    幾個建議:
    (1) 不要硬把 button1_Click_1 這個本來委派給 button1 的 method 塞給 timer 的 Tick 事件 (其他也一樣),
    寧可寫一個新的 method , 讓 button1_Click_1 和 timer1_tick Method 去呼叫。

    (2) 你用的應該是 Forms.Timer , 他並非多緒的 Timer , 因為 Forms.Timer 的 Tick Event 的委派函式是執行在建立 Forms.Timer 的執行緒上, 一般來說都會是在主要的 UI 執行緒上。(Timers.Timer 和 Threading.Timer 才是多緒的)

    (3) 不要一直將方法(或稱函式, method)委派給事件,你委派的越多次,事件觸發後,那些方法就需要更多次的呼叫與執行。

    (4) 關於 Timer 的一些基本內容, 可以參考
    海角點部落 計時器系列


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



    2018年12月1日 上午 11:38
    版主

所有回覆

  • 你的 Timer 時間並沒有很密集,你撈資料的迴圈是怎樣?

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2018年11月29日 下午 03:16
  • Timer1會觸發Button1,

    Button1裡面會暫停Timer1、啟動Timer2,

    Timer2會觸發Button2,

    Button2裡面會暫停Timer2、啟動Timer3,

    Timer3會觸發Button3,

    Button3裡面會暫停Timer3、啟動Timer1,

    -

    程式跑了2個禮拜都沒問題,只是好奇為什麼

    使用 timer1.Stop(); 很正常

    使用 timer1.Enabled=false; 運行大約5-10分鐘程式會當掉而且是CPU過高,然而使用CPU效能檢測卻找不到原因

    -

    是不是因為每次關閉Timer

    timer1.Enabled=false;

    後需要再跑開啟Timer

    timer1.Tick += new EventHandler(button1_Click);

    系統上運行愈來愈多的Timer所以導致當機




    • 已編輯 廷宗 2018年12月1日 上午 02:44
    2018年12月1日 上午 02:35
  • 你掛事件應該在 Form_Load 或是 Tick 事件上去掛。

    再在 Timer 事件上去 呼叫你要的功能

    你可以在疑似無回應時,按下 ctrl+break ,看看反黃的程式碼是哪裡,然後透過 F11 逐步執行,看看執行到哪一步出問題。

    有一本專門講我上一句提到熱鍵的相關書籍,雖然針對 Visual Studio 1998 ,不過基本邏輯與功能沒變,書名叫做 程式除錯的奧秘:

    https://www.google.com.tw/search?q=%22%E7%A8%8B%E5%BC%8F%E9%99%A4%E9%8C%AF%E7%9A%84%E5%A5%A7%E7%A7%98%22


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2018年12月1日 上午 05:31
  • 因為 code 不太齊, 看了好幾次後, 發現可能有個小問題。

    你是不是在 button1_Click_1 這個 method 裡有寫
    timer2.Tick += new EventHandler(button2_Click);

    而每次 Timer1 的 Tick 被發動的時候, 他就會執行 button_Click_1 method ?

    如果這樣, timer2 的 Tick event 會不斷地加入對 button2_Click Method 的參考, 也就是當 timer2 的 Tick 被發動的時候, 會執行越來多越多次的 button2_Click method, 所以就會一直飆高 CPU。

    幾個建議:
    (1) 不要硬把 button1_Click_1 這個本來委派給 button1 的 method 塞給 timer 的 Tick 事件 (其他也一樣),
    寧可寫一個新的 method , 讓 button1_Click_1 和 timer1_tick Method 去呼叫。

    (2) 你用的應該是 Forms.Timer , 他並非多緒的 Timer , 因為 Forms.Timer 的 Tick Event 的委派函式是執行在建立 Forms.Timer 的執行緒上, 一般來說都會是在主要的 UI 執行緒上。(Timers.Timer 和 Threading.Timer 才是多緒的)

    (3) 不要一直將方法(或稱函式, method)委派給事件,你委派的越多次,事件觸發後,那些方法就需要更多次的呼叫與執行。

    (4) 關於 Timer 的一些基本內容, 可以參考
    海角點部落 計時器系列


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



    2018年12月1日 上午 11:38
    版主
  • 請問樓主已經解決這個問題了嗎?

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

    2018年12月12日 上午 06:37
    版主
  • 原來如此,我懂了

    2019年1月13日 下午 02:37
  • 已解決,感謝您的詳解。
    2019年1月13日 下午 02:38