[c#]таймер C#. как сократить потребление ресурсов ЦП
Есть некий код, в котором по таймеру запускается процесс cmd. В cmd передается команда "показать состояние размещённой сети" (netsh wlan show hostednetwork). Результат заносится в переменную log1 Затем через некоторую паузу Task.Delay вызывается цикл foreach поиска mac адреса через регулярное выражение
Regex.IsMatch(podstroka, "..:..:..:..:..:..")
вот часть кода
public async void GetClients()
{
RegistryKey RegKeysMac = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\MyFI\DB");
await Task.Run(() =>
{
Process proc = Process.Start(new ProcessStartInfo
{
StandardOutputEncoding = Encoding.GetEncoding("CP866"),
FileName = "PowerShell",
Arguments = "& 'cmd' '/c chcp 866 & netsh wlan show hostednetwork'", //powershell используется здесь вместо cmd из-за проблем с кодировкой на win7
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true
});
try
{
string[] log1 = proc.StandardOutput.ReadToEnd().ToString().Remove(0, 465).Split();
foreach (string podstroka in log1)
{
if (Regex.IsMatch(podstroka, "..:..:..:..:..:.."))
{
MAClist.Items.Add(podstroka);
}
}
foreach (string item in MAClist.Items) //Поиск присвоенных имен устройств по MAC в базе программы
{
foreach (string Keyname in RegKeysMac.GetValueNames())
{
if (item.Contains(Keyname))
{
string value = RegKeysMac.GetValue(Keyname).ToString();
DeviceNameList.Items.Add(value);
}
}
}
}
catch
{
}
});
ClientsNumber.Text = MAClist.Items.Count.ToString();
}
Данный цикл повторяется примерно каждые 10 секунд (время задается пользователем). Вопрос в том, как сократить потребление ресурсов? Есть версия, чтобы запускать cmd или powershell только 1 раз и по очереди передовать команды, делать паузу, потом опять передать команду. Но не понятно, как сделать так, чтобы таймер передавал команды именно в нужный процесс.
cls
netsh wlan show drivers
Task.Delay(1000)
Может есть другой способ? Пробовал делать так
public void GetClienst() //это тестовый блок, чтобы сократить потребление ресурсов
{
richTextBox1.Text = "";
cmdProc.StartInfo = new ProcessStartInfo("cmd", "cls");
cmdProc.Start();
cmdProc.StartInfo = new ProcessStartInfo()
{
StandardErrorEncoding = Encoding.GetEncoding("CP866"),
FileName = "cmd",
Arguments = "/c netsh wlan show hostednetwork",
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true
};
cmdProc.Start();
cmdProc.WaitForExit();
richTextBox1.Text = cmdProc.StandardOutput.ReadToEnd();
}
но в итоге запускается новый экземпляр cmd
второй таймер выводит уведомления о контретно подключенном / отключенном устр-ве
private void notificationsTimer_Tick(object sender, EventArgs e)
{
string deviceCount = Registry.CurrentUser.CreateSubKey(@"Software\MyFI\Settings").GetValue("ClientsCount", "0").ToString();
notifyIcon1.Text = $"MyFI\nПодключенных устр-в: {ClientsNumber.Text}";
if (ClientsNumber.Text != deviceCount)
{
if (Convert.ToInt32(ClientsNumber.Text) > Convert.ToInt32(deviceCount))
{
try
{
foreach (string item in DeviceNameList.Items)
{
if (!DevNames.Contains(item))
{
DevNames.Add(item);
Registry.CurrentUser.CreateSubKey(@"Software\MyFI\Settings").SetValue("ClientsCount", ClientsNumber.Text);
notifyIcon1.ShowBalloonTip(3, $"Новое подключение ({item})", $"Подключенных устройств {ClientsNumber.Text}", ToolTipIcon.Info);
return;
}
}
}
catch { }
Registry.CurrentUser.CreateSubKey(@"Software\MyFI\Settings").SetValue("ClientsCount", ClientsNumber.Text);
notifyIcon1.ShowBalloonTip(3, "Новое подключение (UnknownDevice)", $"Подключенных устройств {ClientsNumber.Text}", ToolTipIcon.Info);
}
else if (Convert.ToInt32(ClientsNumber.Text) < Convert.ToInt32(deviceCount))
{
try
{
foreach (string Device in DevNames)
{
if (!DeviceNameList.Items.Contains(Device))
{
DevNames.Remove(Device);
Registry.CurrentUser.CreateSubKey(@"Software\MyFI\Settings").SetValue("ClientsCount", ClientsNumber.Text);
notifyIcon1.ShowBalloonTip(3, $"Отключение ({Device})", $"Подключенных устройств {ClientsNumber.Text}", ToolTipIcon.Info);
return;
}
}
}
catch { }
Registry.CurrentUser.CreateSubKey(@"Software\MyFI\Settings").SetValue("ClientsCount", ClientsNumber.Text);
notifyIcon1.ShowBalloonTip(3, "Отключение (UnknownDevice)", $"Подключенных устройств {ClientsNumber.Text}", ToolTipIcon.Info);
}
}
else
{
}
}