У меня есть программа, которая создает поток для поиска WMI (классов Win32) для проверки всех видов системной информации. Теперь я создаю поток для каждого поиска, но, очевидно, когда я использую свое поле со списком и быстро прокручиваю или вызываю несколько потоков, процессор будет резко увеличиваться, и даже после закрытия формы отправленные «команды» по-прежнему переходят к провайдеру wmi, вызывая процессор всплеск довольно долго ...
Вопрос:
Каким будет лучший способ ограничить использование процессора / максимальное количество потоков, созданных для предотвращения скачков процессора, не закрывая форму. (Я могу отправить процесс уничтожения для процесса поставщика WMI, если я закрою форму, чтобы остановить его).
Изображение:
Код:
namespace Admin_Helper
{
public partial class frmHardwareInformation : Form
{
public frmHardwareInformation()
{
InitializeComponent();
}
string searchQuery;
private void cmbItemList_SelectedIndexChanged(object sender, EventArgs e)
{
var dctPropertyList = new Dictionary<string, string>(); //Store property name/value
searchQuery = cmbItemList.SelectedItem.ToString(); //Search term
new Thread(() => FindWMI(searchQuery, dctPropertyList, lstHwSearchList)).Start(); //Start thread for each search
}
private void FindWMI(string s, Dictionary<string, string> dct, ListView listView)
{
try
{
ManagementObjectSearcher moSearcher = new ManagementObjectSearcher("select * from " + s);
Invoke(new MethodInvoker(() =>
{
listView.Items.Clear(); //Clear items to prevent endless list
}));
foreach (ManagementObject moObject in moSearcher.Get())
{
if (moObject != null) //Gives errors if I don't check for null's..
{
foreach (PropertyData propData in moObject.Properties)
{
if (propData.Value != null && propData.Value.ToString() != "" && propData.Name != null && propData.Name != "") //More prevention of errors..
dct[propData.Name] = propData.Value.ToString();
}
}
}
foreach (KeyValuePair<string, string> listItem in dct)
{
Invoke(new MethodInvoker(() =>
{
listView.Items.Add(listItem.Key).SubItems.Add(listItem.Value);
Application.DoEvents();
}));
}
}
catch (Exception) { } //Mostly catches invalid searches nothing too bad so far
}
}
}
РЕДАКТИРОВАТЬ: включены изменения кода
* Добавлены процессы убийства при закрытии формы, создание списка и запуск всего обновления в 1x.
private void FindWMI(string s, Dictionary<string, string> dct, ListView listView)
{
try
{
List<ListViewItem> itemsList = new List<ListViewItem>();
ManagementObjectSearcher moSearcher = new ManagementObjectSearcher("select * from " + s);
Invoke(new MethodInvoker(() =>
{
listView.Items.Clear();
}));
foreach (ManagementObject moObject in moSearcher.Get())
{
if (moObject != null)
{
foreach (PropertyData propData in moObject.Properties)
{
if (propData.Value != null && propData.Value.ToString() != "" && propData.Name != null && propData.Name != "")
dct[propData.Name] = propData.Value.ToString();
}
}
}
foreach (KeyValuePair<string, string> listItem in dct)
{
ListViewItem lstItem = new ListViewItem(listItem.Key);
lstItem.SubItems.Add(listItem.Value);
itemsList.Add(lstItem);
}
Invoke(new MethodInvoker(() =>
{
listView.Items.AddRange(itemsList.ToArray());
}));
}
catch (Exception) { }
}
private void frmHardwareInformation_FormClosed(object sender, FormClosedEventArgs e)
{
foreach (System.Diagnostics.Process myProc in System.Diagnostics.Process.GetProcesses())
{
if (myProc.ProcessName == "WmiPrvSE")
{
myProc.Kill();
}
}
}