While the app was running, working set grew ~20 MB/min (reaching tens of GB over a day). dotnet-gcdump traced it to COM-callable wrappers accumulating from the per-tick binding interop: SensorTreeItemViewModel.RefreshValues raised PropertyChanged for Value/Min/Max/ToolTip on every sensor every update tick, and ViewModelBase allocated a new PropertyChangedEventArgs per raise. WinUI's binding engine is native, so each raised event marshals its args across the boundary and retains a wrapper. - ViewModelBase: reuse one cached PropertyChangedEventArgs per property name. - SensorTreeItemViewModel.RefreshValues: raise PropertyChanged only when the formatted text actually changed. Also close a leaked D3DKMT adapter handle: D3DDisplayDevice.GetDeviceInfoByIdentifier opened the adapter but skipped CloseAdapter on every early-return failure path, and it runs on each GPU's Update() tick. Close it in a finally block. Verified with dotnet-gcdump over an 18-minute soak: managed heap and live object count stay flat (~50 MB) instead of climbing 47 -> 470 MB. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
LibreHardwareMonitor
Libre Hardware Monitor is free software that can monitor the temperature sensors, fan speeds, voltages, load and clock speeds of your computer.
What's included?
What can it do?
You can read information from devices such as:
- Motherboards
- Intel and AMD processors
- NVIDIA, AMD and Intel graphics cards
- HDD, SSD and NVMe hard drives
- Network cards
Where can I download it?
You can download the latest release here.
Nightly builds
If you have a GitHub account, you can download nightly builds here. Otherwise, you can download the latest nightly build here.
How can I help improve it?
The LibreHardwareMonitor team welcomes feedback and contributions!
You can check if it works properly on your motherboard. For many manufacturers, the way of reading data differs a bit, so if you notice any inaccuracies, please send us a pull request. If you have any suggestions or improvements, don't hesitate to create an issue.
Developer information
Integrate the library in own application
- Add the LibreHardwareMonitorLib NuGet package to your application.
- Use the sample code below.
Sample code
Computer computer = new Computer
{
IsCpuEnabled = true,
IsGpuEnabled = true,
IsMemoryEnabled = true,
IsMotherboardEnabled = true,
IsControllerEnabled = true,
IsNetworkEnabled = true,
IsStorageEnabled = true,
IsPowerMonitorEnabled = true,
};
computer.Open();
computer.Accept(new UpdateVisitor());
foreach (IHardware hardware in computer.Hardware)
{
Console.WriteLine("Hardware: {0}", hardware.Name);
foreach (IHardware subhardware in hardware.SubHardware)
{
Console.WriteLine("\tSubhardware: {0}", subhardware.Name);
foreach (ISensor sensor in subhardware.Sensors)
Console.WriteLine("\t\tSensor: {0}, value: {1}", sensor.Name, sensor.Value);
}
foreach (ISensor sensor in hardware.Sensors)
Console.WriteLine("\tSensor: {0}, value: {1}", sensor.Name, sensor.Value);
}
computer.Close();
public class UpdateVisitor : IVisitor
{
public void VisitComputer(IComputer computer) => computer.Traverse(this);
public void VisitHardware(IHardware hardware)
{
hardware.Update();
foreach (IHardware subHardware in hardware.SubHardware)
subHardware.Accept(this);
}
public void VisitSensor(ISensor sensor) { }
public void VisitParameter(IParameter parameter) { }
}
Administrator rights
Some sensors require administrator privileges to access the data. Restart your IDE with admin privileges, or add an app.manifest file to your project with requestedExecutionLevel on requireAdministrator.
Warning
We're not affiliated with librehardwaremonitor.com.
For your safety, please avoid using that site.
Acknowledgements
Many thanks to all contributors listed below, and to JetBrains for providing tooling.
License
LibreHardwareMonitor is free and open source software licensed under MPL 2.0. Some parts of LibreHardwareMonitor are licensed under different terms, see THIRD-PARTY-LICENSES.