kgg124 Ответов: 1

[C#] как быстро обновить listview?


Всем привет!

Я пытаюсь сделать программу, похожую на Диспетчер задач.

Эта программа контролирует использование памяти процесса.

Итак, я создал поток для обновления, и он периодически запускается в течение 1 секунды.

Если данные об использовании памяти процесса будут обновлены, они будут показаны в listview.

Но обновление происходит очень медленно.

Я приложил свой пример кода.

Мой пример кода.[^]

Не могли бы вы дать мне совет?

Спасибо :)

Что я уже пробовал:

public void UpdateThread(object aParameters)
        {
            object[] lParameters = (object[])aParameters;
            Form1 lThis = (Form1)lParameters[0];

            while (lThis._isWorkingThread)
            {
                Thread.Sleep(1000);

                lThis.BeginInvoke(new UpdateListViewDelegate(lThis.updateList), new object[0] {  });
            }
        }

        public void updateList()
        {
            Process[] allProc = Process.GetProcesses();

            foreach (var p in allProc)
            {
                if (processes.ContainsKey(p.Id.ToString()) == false)
                {
                    ProcessInfo info = new ProcessInfo();
                    info.name = p.ProcessName;
                    info.workingSet = p.WorkingSet64;
                    info.peakWorkingSet = p.PeakWorkingSet64;
                    info.privateMemorySize = p.PrivateMemorySize64;

                    processes.Add(p.Id.ToString(), info);
                }
                else
                {
                    ProcessInfo info = processes[p.Id.ToString()];
                    info.workingSet = p.WorkingSet64;
                    info.peakWorkingSet = p.PeakWorkingSet64;
                    info.privateMemorySize = p.PrivateMemorySize64;
                }

                ListViewItem item;
                item = FindItem(p.Id.ToString());
                if (item == null)
                {
                    item = listViewProcessList.Items.Add(p.ProcessName);
                    item.SubItems.Add(p.Id.ToString());

                    item.SubItems.Add(string.Format("{0:#,###} K", (p.WorkingSet64 / 1024)).PadLeft(7));
                    item.SubItems.Add(string.Format("{0:#,###} K", (p.PeakWorkingSet64 / 1024)).PadLeft(7));
                    item.SubItems.Add(string.Format("{0:#,###} K", (p.PrivateMemorySize64 / 1024)).PadLeft(7));
                }
                else
                {
                    item.SubItems[2].Text = string.Format("{0:#,###} K", (p.WorkingSet64 / 1024)).PadLeft(7);
                    item.SubItems[3].Text = string.Format("{0:#,###} K", (p.PeakWorkingSet64 / 1024)).PadLeft(7);
                    item.SubItems[4].Text = string.Format("{0:#,###} K", (p.PrivateMemorySize64 / 1024)).PadLeft(7);
                }
            }
        }

1 Ответов

Рейтинг:
1

RickZeeland

Это может быть более быстрый способ получить процессы: .net - самый быстрый и наименее ресурсоемкий способ получения списка запущенных процессов с их идентификатором и местоположением в C# - Stack Overflow[^]

Я бы также рекомендовал использовать:

ListView.BeginUpdate();
  // your code
ListView.EndUpdate()