Отмена PerformanceCounter - PullRequest
       8

Отмена PerformanceCounter

0 голосов
/ 10 апреля 2019

В моем приложении 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();

Спасибо большое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...