亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C# WinForms 嘗試使用計時器更新 UI 但不會降低性能

C# WinForms 嘗試使用計時器更新 UI 但不會降低性能

C#
慕妹3146593 2021-06-29 17:08:31
所以目前我有一個有 2 個進程的應用程序。一個進程是 ping,而 ping 進程是將結果寫入數組。另一個過程是使用計時器每秒更新 UI。更準確地說,正在更新的是一個mschart。這就是我設置計時器的方式:readonly System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();myTimer.Interval = 1000;myTimer.Tick += WriteFunction;現在這是我每秒調用的方法以刷新 UI/實際圖形: private void WriteFunction(object objectInfo, EventArgs e)        {            foreach (NetPinger.source.AddGraph b in graphList)            {                b.fileRead();            }        }更新圖表的方法在另一個類中,如下所示:    public void fileRead()    {        double unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;        chart_holder.Series[0].Points.Clear();        for (double i = unixTimestamp; unixTimestamp - graphSizing < i; i--)        {            bool exists;            try            {                exists = Array.Exists(file, element => element.XValue == i);                exists = true;            }            catch            {                exists = false;            }            try            {                if (exists == false)                {                    DataPoint point = new DataPoint(i, 0);                    chart_holder.Series[0].Points.Add(point);                }                else                {                    DataPoint point = Array.Find(file, element => element.XValue == i);                    chart_holder.Series[0].Points.Add(point);                }            }            catch(Exception ex)            {                MessageBox.Show(Convert.ToString(ex));            }        }    }現在我注意到的是,如果 graphSizing(我循環通過的數字)保持在較低水平,則性能會很好,并且一切都是同步的(來自 UI 的多個圖形同時更新等),就像它應該的那樣。但是,一旦我上升,讓我們說喜歡 50 甚至 250(目標應該是什么),UI 和圖形更新就會非常非常緩慢。它只是每 3 秒更新一次,并且用戶界面通常非常滯后和緩慢。有沒有人有任何建議我如何保持良好的性能,或者我搞砸了 UI 太慢?如有更多問題或更多詳細信息,請隨時提問。
查看完整描述

1 回答

?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

您的代碼始終在 UI 線程中運行,因為System.Windows.Forms.Timer在 UI 線程上調用委托。即使情況并非如此(并且您使用 System.Timer 代替),您也可以通過 Invoke 調用將所有內容委托回 UI。您需要確保首先在另一個線程上準備數據,并在 UI 線程本身中盡可能少做。


查看完整回答
反對 回復 2021-07-10
  • 1 回答
  • 0 關注
  • 209 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號