为什么应用程序在timer2 tick事件中调用two函数时工作如此缓慢
本文关键字:函数 工作 缓慢 two 调用 应用程序 timer2 tick 事件 为什么 | 更新日期: 2024-10-22 14:58:47
我想问题是foreach循环太多了。但我需要他们拿到传感器。价值
这是两个功能:
private void cpuView()
{
Computer myComputer = new Computer();
myComputer = new Computer(settings) { CPUEnabled = true };
myComputer.Open();
Trace.WriteLine("");
foreach (var hardwareItem in myComputer.Hardware)
{
if (hardwareItem.HardwareType == HardwareType.CPU)
{
hardwareItem.Update();
foreach (IHardware subHardware in hardwareItem.SubHardware)
subHardware.Update();
foreach (var sensor in hardwareItem.Sensors)
{
settings.SetValue("sensor", sensor.Value.ToString());
if (sensor.SensorType == SensorType.Temperature)
{
sensor.Hardware.Update();
settings.GetValue("sensor", sensor.Value.ToString());
temperature_label.Text = sensor.Value.ToString() + "c";//String.Format("{0} Temperature = {1}c", sensor.Name, sensor.Value.HasValue ? sensor.Value.Value.ToString() : "no value");
}
}
}
}
}
第二个功能:
private void gpuView()
{
Computer computer = new Computer();
computer.Open();
computer.GPUEnabled = true;
foreach (var hardwareItem in computer.Hardware)
{
if (videoCardType("ati", "nvidia") == true)
{
HardwareType htype = HardwareType.GpuNvidia;
if (hardwareItem.HardwareType == htype)
{
foreach (var sensor in hardwareItem.Sensors)
{
if (sensor.SensorType == SensorType.Temperature)
{
sensor.Hardware.Update();
if (sensor.Value.ToString().Length > 0)
{
if (newGPULabel.Text.Length < 1)
{
if (UpdatingLabel(sensor.Value.ToString(), string.Empty))
{
label8.Text = newGPULabel.Text;
}
}
else if (UpdatingLabel(sensor.Value.ToString(), newGPULabel.Text.Substring(0, newGPULabel.Text.Length - 1)))
{
label8.Text = newGPULabel.Text;
}
newGPULabel.Text = sensor.Value.ToString() + "c";
label8.Visible = true;
}
int t = newGPULabel.Text.Length;
if (t >= 4)
{
newGPULabel.Location = new Point(210, 100);
}
else
{
newGPULabel.Location = new Point(250, 100);
}
timer2.Interval = 1000;
if (sensor.Value > 90)
{
Logger.Write("The current temperature is ===> " + sensor.Value);
button1.Enabled = true;
}
this.Select();
}
}
}
}
else
{
HardwareType htype = HardwareType.GpuAti;
if (hardwareItem.HardwareType == htype)
{
foreach (var sensor in hardwareItem.Sensors)
{
if (sensor.SensorType == SensorType.Temperature)
{
sensor.Hardware.Update();
if (sensor.Value.ToString().Length > 0)
{
if (newGPULabel.Text.Length < 1)
{
if (UpdatingLabel(sensor.Value.ToString(), string.Empty))
{
label8.Text = newGPULabel.Text;
}
}
else if (UpdatingLabel(sensor.Value.ToString(), newGPULabel.Text.Substring(0, newGPULabel.Text.Length - 1)))
{
label8.Text = newGPULabel.Text;
}
newGPULabel.Text = sensor.Value.ToString() + "c";
label8.Visible = true;
}
int t = newGPULabel.Text.Length;
if (t >= 4)
{
newGPULabel.Location = new Point(210, 100);
}
else
{
newGPULabel.Location = new Point(250, 100);
}
timer2.Interval = 1000;
if (sensor.Value > 90)
{
Logger.Write("The current temperature is ===> " + sensor.Value);
button1.Enabled = true;
}
this.Select();
}
}
}
}
}
}
在timer2 tick事件中:
private void timer2_Tick(object sender, EventArgs e)
{
gpuView();
cpuView();
}
如果我在tick事件中不调用这些函数,程序运行得很顺利,但即使我只调用其中一个函数,它也会每隔n秒卡住一次。
时间r2被设置为间隔100,因为我更新cpu和gpu温度,我想快速更新它们。我不确定问题是函数中的foreach循环太多,还是间隔是100,所以它试图从传感器中获得值的速度太快,所以硬件不能太快地发送信息。
也许有一种方法可以去除前臂的一些环?我不想把我所有的Form1代码都上传到这里。但是所有的软件和硬件都与OpenHardwareMonitorApplication的OpenHardwareMonitoring.dll连接。
您可以使用后台工作程序,它允许您以简单的方式执行多线程。它将对您的案例有用,并以异步方式调用doWork方法。在这个方法中,调用循环中的两个函数。此处为msdn解释http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx设置一个随机间隔值比计时器要好,因为你必须让你的函数完成,这样如果必须发生事件,它就不会。。。。
如果您希望应用程序再次平稳运行,可以使用application.DoEvents();void,ehich使应用程序为高要求的代码做准备。
样本,在您的勾选事件中:
private void timer2_Tick(object sender, EventArgs e)
{
Application.DoEvents();
gpuView();
cpuView();
}
或者,您可以使用System.threading命名空间