为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 182 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信