【发布时间】:2018-05-06 02:44:53
【问题描述】:
在我的 WPF UI 中更新某些内容时遇到问题。抛出异常的同一部分代码在另一个函数中工作得很好。现在,由于某种原因,我无法弄清楚它不仅抛出异常,而且也没有像我想要的那样更新。我希望 OnCPUDetEvent() 函数中的 UI 元素根据我设置的计时器进行更新。
这是我的代码:
using System;
using System.Collections.Generic;
using System.Management.Instrumentation;
using System.Management;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Runtime.Serialization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace HWDetCS
{
/// <summary>
/// Interaction logic for CPUBase.xaml
/// </summary>
public partial class CPUBase : Page
{
// lists are better than arrays, fite me!
public List<string> names = new List<string>();
public List<string> values = new List<string>();
public int i = 0;
// Set up a timer to be enabled later
public Timer CPUDetRefreshTimer;
public CPUBase()
{
// Auto generated stuff, don't touch!
InitializeComponent();
// Actually run all the detection stuff
CPUDet();
// Start up the Timer, and get it ready
CPUDetRefreshTimer = new Timer();
CPUDetRefreshTimer.AutoReset = true;
CPUDetRefreshTimer.Interval = 500;
CPUDetRefreshTimer.Enabled = true;
CPUDetRefreshTimer.Elapsed += OnCPUDetEvent;
}
// This thing does all the work
public void CPUDet()
{
// Get the CPU Management class, this makes it the CPU we get info off of rather than nothing, because if it wasnt set to the CPU, it would error and break and cry a lot... dont change it.
ManagementClass CPUClass = new ManagementClass("Win32_Processor");
CPUClass.Options.UseAmendedQualifiers = true;
// Set up a data collection to get the data off of, this and the next thing SHOULD NEVER BE IN A LOOP! IT WILL BREAK YOUR CPU LIKE A BALLOON!
PropertyDataCollection dataCollection = CPUClass.Properties;
// Get the instance of the class, for some reason this is required to work, dont touch AND DONT PUT IT IN A LOOP WHY CANT YOU LISTEN!?
ManagementObjectCollection instanceCollection = CPUClass.GetInstances();
// This is a loop, its very fragile, dont touch it, it gets the list of data we are collecting
foreach (PropertyData property in dataCollection)
{
// adds the names into one nice readable-ish list!
names.Add(property.Name);
// loop through all the instances and grabs the actual data off of it
foreach (ManagementObject instance in instanceCollection)
{
// makes sure we dont get null reference errors, I HATE THOSE SO MUCH! I KNOW ITS NULL JUST SHUT UP!
if (instance.Properties[property.Name.ToString()].Value == null)
{
// if its null, dont add the actual property data, INSTEAD, add a string that says null so we know not to mess with it
values.Add("null");
}
else
{
// otherwise, go right ahead
values.Add(instance.Properties[property.Name.ToString()].Value.ToString());
}
}
// counting....
i++;
}
// Debug stuff, dont release uncommented!
// TODO: COMMENT THIS OUT!
for (int x = 0; x < names.Count - 1; x++)
{
Console.WriteLine(x.ToString());
Console.WriteLine(names[x]);
Console.WriteLine(values[x]);
}
// Get the name
CPUNameText.Content = values[29];
// Get the manufacturer
CPUManuText.Content = values[27];
// Get the number of CORES (NOT THREADS!)
CPUCoreCountText.Content = values[30];
// Get the Family
CPUFamilyText.Content = values[18];
}
public void OnCPUDetEvent(Object obj, ElapsedEventArgs args)
{
//Console.WriteLine("Event Fire!");
// Get the current clock speed
CPUClockSpeedText.Content = values[10] + "MHz";
// Get the current Voltage
CPUCVoltageText.Content = (Convert.ToDouble(values[11]) / 10).ToString() + " Volts";
}
}
}
这是实际 UI 页面的 XAML:
<Page x:Class="HWDetCS.CPUBase"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:HWDetCS"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
Title="CPUBase" MinWidth="1280" MinHeight="720">
<Grid Background="Gray">
<DockPanel>
<UniformGrid Rows="6" Columns="2">
<Label x:Name="CPUNameLabel" Content="CPU Name:" FontSize="36" FontWeight="Bold" Foreground="#FF007ACC" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<Label x:Name="CPUNameText" Content="Label" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="24" FontWeight="Bold" Foreground="#FF007ACC"/>
<Label x:Name="CPUManuLabel" Content="CPU Manufacturer:" FontSize="36" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontWeight="Bold" Foreground="#FF007ACC"/>
<Label x:Name="CPUManuText" Content="Label" Foreground="#FF007ACC" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="24" FontWeight="Bold"/>
<Label x:Name="CPUClockSpeedLabel" Content="CPU Clock Speed:" Foreground="#FF007ACC" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="36" FontWeight="Bold"/>
<Label x:Name="CPUClockSpeedText" Content="Label" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="24" FontWeight="Bold" Foreground="#FF007ACC"/>
<Label x:Name="CPUCoreCountLabel" Content="CPU Core Count:" Foreground="#FF007ACC" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="36" FontWeight="Bold"/>
<Label x:Name="CPUCoreCountText" Content="Label" Foreground="#FF007ACC" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="24" FontWeight="Bold"/>
<Label x:Name="CPUFamilyLabel" Content="CPU Family:" FontSize="36" FontWeight="Bold" Foreground="#FF007ACC" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<Label x:Name="CPUFamilyText" Content="Label" Foreground="#FF007ACC" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="24" FontWeight="Bold"/>
<Label x:Name="CPUCVoltageLabel" Content="CPU Current Voltage:" FontSize="36" FontWeight="Bold" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Foreground="#FF007ACC"/>
<Label x:Name="CPUCVoltageText" Content="Label" Foreground="#FF007ACC" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="24" FontWeight="Bold"/>
</UniformGrid>
</DockPanel>
</Grid>
</Page>
【问题讨论】:
-
您应该添加一个 try-catch 块以查看实际发生的情况。我们无法仅通过
InvalidOperationException为您提供帮助 -
也提供window.xaml。如果您在 app.xaml 中有特定的说明,请描述或添加。
-
并在此处发表评论以通知我们
-
我在抛出异常的 2 行(如果包含 cmets 为 4 行)上使用了 try-catch 块,它所做的只是我在 Visual Studio 的输出窗口中收到的垃圾邮件数量的两倍
-
>> "引发异常的同一部分代码在另一个函数中工作得很好。"我认为我们无法分辨出代码的哪一部分正在抛出以及哪个函数对您来说可以正常工作。请详细说明。此外,请考虑共享异常详细信息,包括堆栈、消息任何内部异常。