Dreamine.Threading.Windows 1.0.1
이 패키지는 다른 어셈블리에서 `DMContainer`를 partial class로 확장하지 않습니다. 등록은 별도의 Registration 클래스를 통해 제공합니다.
로딩중...
검색중...
일치하는것 없음
WindowsProcessCpuUsageProvider.cs
이 파일의 문서화 페이지로 가기
1using System;
2using System.Diagnostics;
3using Dreamine.Threading.Interfaces;
4
6
15public sealed class WindowsProcessCpuUsageProvider : ICpuUsageProvider, IDisposable
16{
25 private readonly object _syncRoot = new();
34 private readonly Process _process;
43 private TimeSpan _lastProcessorTime;
52 private DateTimeOffset _lastTimestamp;
61 private double _lastCpuUsage;
70 private bool _disposed;
71
89 {
90 _process = Process.GetCurrentProcess();
91 _lastProcessorTime = _process.TotalProcessorTime;
92 _lastTimestamp = DateTimeOffset.Now;
93 }
94
120 {
121 lock (_syncRoot)
122 {
123 if (_disposed)
124 {
125 return _lastCpuUsage;
126 }
127
128 _process.Refresh();
129
130 var now = DateTimeOffset.Now;
131 var currentProcessorTime = _process.TotalProcessorTime;
132
133 var elapsedMs = (now - _lastTimestamp).TotalMilliseconds;
134 if (elapsedMs < 200)
135 {
136 return _lastCpuUsage;
137 }
138
139 var cpuTimeMs = (currentProcessorTime - _lastProcessorTime).TotalMilliseconds;
140
141 var cpuUsage = cpuTimeMs / (elapsedMs * Environment.ProcessorCount) * 100.0;
142
143 _lastProcessorTime = currentProcessorTime;
144 _lastTimestamp = now;
145 _lastCpuUsage = Math.Clamp(cpuUsage, 0, 100);
146
147 return _lastCpuUsage;
148 }
149 }
150
159 public void Dispose()
160 {
161 lock (_syncRoot)
162 {
163 if (_disposed)
164 {
165 return;
166 }
167
168 _disposed = true;
169
170 try
171 {
172 _process.Dispose();
173 }
174 catch
175 {
176 // Suppress on dispose.
177 }
178 }
179 }
180}