このガイドに従ってWPF スレッド モデルを作成し、現在の CPU 使用率とピーク時の CPU 使用率を監視して表示する小さなアプリケーションを作成しました。しかし、イベント ハンドラーで現在の CPU とピーク CPU を更新しても、ウィンドウ内の数値はまったく変化しません。デバッグ時に、テキスト フィールドは変更されますが、ウィンドウで更新されないことがわかります。
このようなアプリケーションを構築するのは悪い習慣であり、代わりに MVVM アプローチを採用する必要があると聞いたことがあります。実際、実行時例外なしでこれを実行できたことに驚いた人もいます。とにかく、最初のリンクからコード例/ガイドを見つけたいと思います。
あなたの考えを教えてください!
そして、ここに私のxamlがあります:
<Window x:Class="UsagePeak2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="CPU Peak" Height="75" Width="260">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" >
<Button Content="Start"
Click="StartOrStop"
Name="startStopButton"
Margin="5,0,5,0"
/>
<TextBlock Margin="10,5,0,0">Peak:</TextBlock>
<TextBlock Name="CPUPeak" Margin="4,5,0,0">0</TextBlock>
<TextBlock Margin="10,5,0,0">Current:</TextBlock>
<TextBlock Name="CurrentCPUPeak" Margin="4,5,0,0">0</TextBlock>
</StackPanel>
これが私のコードです
public partial class MainWindow : Window
{
public delegate void NextCPUPeakDelegate();
double thisCPUPeak = 0;
private bool continueCalculating = false;
PerformanceCounter cpuCounter;
public MainWindow() : base()
{
InitializeComponent();
}
private void StartOrStop(object sender, EventArgs e)
{
if (continueCalculating)
{
continueCalculating = false;
startStopButton.Content = "Resume";
}
else
{
continueCalculating = true;
startStopButton.Content = "Stop";
startStopButton.Dispatcher.BeginInvoke(
DispatcherPriority.Normal, new NextCPUPeakDelegate(GetNextPeak));
//GetNextPeak();
}
}
private void GetNextPeak()
{
cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
double currentValue = cpuCounter.NextValue();
CurrentCPUPeak.Text = Convert.ToDouble(currentValue).ToString();
if (currentValue > thisCPUPeak)
{
thisCPUPeak = currentValue;
CPUPeak.Text = thisCPUPeak.ToString();
}
if (continueCalculating)
{
startStopButton.Dispatcher.BeginInvoke(
System.Windows.Threading.DispatcherPriority.SystemIdle,
new NextCPUPeakDelegate(this.GetNextPeak));
}
}
}