В моем приложении WPF C # у меня есть форма, которая отображает производительность в реальном времени (например, процессор, память и диски) удаленного хоста.В этой форме у меня также есть кнопка отмены и закрытия.
Счетчик производительности работает хорошо, но иногда для отображения может потребоваться около 30 секунд.В этом случае я хочу иметь возможность отменить эту задачу при загрузке ...Вот код:
private async void DoWork_Async()
{
if (!m_running)
{
m_running = true;
try
{
await Task.Run(() => CreatePerformanceCounters(hostname, cts.Token));
m_running = false;
}
catch (OperationCanceledException)
{
// logIt.AppendText("Cancelled");
Console.WriteLine("Cancelled");
Close();
}
}
else
{
cts.Cancel();
}
}
private void CreatePerformanceCounters(string hostname, CancellationToken ct)
{
cpuUsage = new PerformanceCounter("Processor", "% Processor Time", "_Total", hostname);
memUsage = new PerformanceCounter("Memory", "% Committed Bytes In Use", "", hostname);
diskUsage = new PerformanceCounter("Paging File", "% Usage", "_Total", hostname);
ct.ThrowIfCancellationRequested();
Console.WriteLine("Perfs Counters created");
dispatcherTimer.Tick += new EventHandler(DispatcherTimer_Tick);
dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 500);
dispatcherTimer.Start();
}
private void DispatcherTimer_Tick(object sender, EventArgs e)
{
float fcpu = cpuUsage.NextValue();
progress_cpu.Value = Math.Round(fcpu, 2);
lbl_cpu_state.Content = Math.Round(fcpu, 2) + " %";
float fmem = memUsage.NextValue();
progress_ram.Value = Math.Round(fmem, 2);
lbl_ram_state.Content = Math.Round(fmem, 2) + " %";
float fdisk = diskUsage.NextValue();
progress_disks.Value = Math.Round(fdisk, 2);
lbl_disks_state.Content = Math.Round(fdisk, 2) + " %";
}
А вот код моей кнопки отмены:
private void Btn_cancel_Click(object sender, RoutedEventArgs e)
{
if (cts != null)
{
cts.Cancel();
}
if (m_running == false)
{
Close();
}
}
Как я могу отменить «новый PerformanceCounter (.....)» в любоммомент с помощью кнопки отмены?
Fyi, я пробовал такие методы, как cpuUsage.Close();
или cpuUsage.RemoveInstance();
Спасибо большое.