使用Parallel.Invoke时CPU使用率不正确

时间:2017-10-16 04:28:13

标签: c# .net wpf task-parallel-library dispatcher

我有一个简单的WPF应用程序,我在Task内进行一些处理,并使用Dispatcher.Timer更新UI的CPU使用率,已用时间和线程数。

Task.Run(() =>
{
    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
    dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 700);
    dispatcherTimer.Start();
}).Wait();

Task process = new Task(() =>
{
    sw.Start();
    ConvertToGrayscale(sourcePath, destinationPath);
    CheckUniqueColorPixels(sourcePath);
});

process.Start();

private void dispatcherTimer_Tick(object sender, EventArgs e)
{
    lblElapsedTime.Content = Math.Round(sw.Elapsed.TotalSeconds, 1);
    lblCPUUsage.Content = getCPUCounter();
    lblThreadCount.Content = Process.GetCurrentProcess().Threads.Count;
}

private double getCPUCounter()
{
    double cpuUsage = 0;
    cpuCounter.CategoryName = "Processor";
    cpuCounter.CounterName = "% Processor Time";
    cpuCounter.InstanceName = "_Total";

    cpuUsage = Math.Round(cpuCounter.NextValue(), 2);

    Task.Delay(1500).ContinueWith(_ =>
    {
        cpuUsage = Math.Round(cpuCounter.NextValue(), 2);
    });

    return cpuUsage;
}

这很好用。但是当我使用Parallel.Invoke

Task process = new Task(() =>
{
    sw.Start();
    Parallel.Invoke(
        () => this.ConvertToGrayscaleP(sourcePath, destinationPath),
        () => this.CheckUniqueColorPixelsP(sourcePath));
});

process.Start();

我的CPU使用率始终显示100,不断更新,永不更新。我怀疑getCPUCounter()中存在一些问题,因为其他值(经过时间和线程数)会更新。

我尝试明确使用Thread.Start()代替Task.Run(),但这不起作用。

如果我能提供更多详情,请告诉我。

感谢。

0 个答案:

没有答案