C # WinForms Попытка обновить пользовательский интерфейс с таймером, но без снижения производительности - PullRequest
0 голосов
/ 29 мая 2018

так что в настоящее время у меня есть приложение, которое имеет 2 процесса.Один процесс - это pining, а ping - это запись результатов в массив.

Другой процесс заключается в обновлении интерфейса пользователя каждую секунду с помощью таймера.То, что является обновлением, является MSchart, чтобы быть более точным.

Вот так я настроил таймер:

readonly System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Interval = 1000;
myTimer.Tick += WriteFunction;

Теперь этот метод я вызываю каждую секунду для обновления пользовательского интерфейса / собственно графика:

 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 (число, через которое я перебираюсь), остается низкимпроизводительность неплохая, и все синхронизировано (несколько графиков из пользовательского интерфейса обновляются одновременно и т. д.), как и должно быть.Но как только я поднимусь, скажем, что 50 или даже 250 (какова должна быть цель) обновление пользовательского интерфейса и графика идет очень-очень медленно.Он обновляется только каждые 3 секунды, а пользовательский интерфейс в целом очень медленный и медленный.

Есть ли у кого-нибудь совет, как мне поддерживать хорошую производительность или где я чертовски заметил, что пользовательский интерфейс такой медленный?Для дальнейших вопросов или более подробной информации не стесняйтесь спрашивать.

Большое спасибо за ваше время и помощь.

Привет C.User

1 Ответ

0 голосов
/ 29 мая 2018

Ваш код всегда выполняется в потоке пользовательского интерфейса, так как System.Windows.Forms.Timer вызывает делегат в потоке пользовательского интерфейса.Даже если это не так (и вместо этого вы использовали System.Timer), вы делегируете все обратно в интерфейс с помощью вызова Invoke.Вы должны сначала подготовить данные в другом потоке и сделать как можно меньше в самом потоке пользовательского интерфейса.

...