В настоящее время я несколько новичок в С#/wpf (и кодировании в целом). Я решил начать еще один проект, будучи своего рода «менеджером задач».
(Хотя я использую привязку, это НЕ проект MVVM, поэтому все ответы приветствуются)
Если вы когда-либо открывали диспетчер задач, вы знаете, что одним из основных полезных инструментов, который он предоставляет, является обновление представления об использовании ЦП / ОЗУ / чего бы то ни было. Сообщение пользователю, какой процент ресурса он использует.
Моя проблема заключается в том, что я не получаю процент ЦП. Я не уверен, как эффективно обновить свойство text для загрузки ЦП в пользовательском интерфейсе.
Моя первая мысль заключалась в том, что я должен создать фонового рабочего (что, вероятно, правильно), чтобы разделить загрузку потоков. Тем не менее, я не могу понять решение полезной реализации фоновых рабочих.
В настоящее время код настроен следующим образом:
- Когда страница загружается, общедоступный BgWrk создает новый экземпляр самого себя.
- Добавляет задачу, которая будет вызываться при запуске.
- BgWrk запущен.
- Создан новый экземпляр вызываемого метода.
- Диспетчер вызывается в основном потоке для обновления пользовательского интерфейса.
- Invoke состоит из установки общедоступной строки PerCpu (привязанной к другому классу, используя INotifyPropertyChanged и все) для возвращаемого значения CpuPerUsed «граббера».
- BgWrk утилизирован.
Циклы программы (это, скорее всего, проблема).
private void Grid_Loaded(object sender, RoutedEventArgs e) { BgWrk = new BackgroundWorker(); BgWrk.DoWork += new DoWorkEventHandler(BackgroundWorker1_DoWork); BgWrk.RunWorkerAsync(); } private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { while (true) { CpuInfoGrabber grabber = new CpuInfoGrabber(); Application.Current.Dispatcher.Invoke(new Action (() => Bnd.PerCpu = grabber.CpuPerUsed())); BgWrk.Dispose(); } }
Опять же, код работает, но он ОЧЕНЬ медленный из-за загрузки всех этих данных. Любые предложения о том, как сделать эту работу хорошо, приветствуются!
Спасибо
Action
. Я предполагаю, чтоgrabber.CpuPerUsed()
- это то, что вы хотите запустить в фоновом потоке. С вашей текущей настройкой вы запускаете этот поток графического интерфейса. - person WBuck   schedule 13.07.2018