public PerformanceCounterSampleSet(DateTime timeStamp, PerformanceCounterSample[] counterSamples) { this.Timestamp = timeStamp; this.CounterSamples = new ReadOnlyCollection<PerformanceCounterSample>(counterSamples); }
public PerformanceCounterSampleSet ReadNextSet() { this._firstRead.Wait(); long fileTimeStamp = 0; uint returnCode = this._isPreVista ? Apis.PdhCollectQueryData(this._safeQueryHandle) : Apis.PdhCollectQueryDataWithTime(this._safeQueryHandle, ref fileTimeStamp); if (this._isLastSampleBad) { return null; } if (returnCode != PdhResults.PDH_CSTATUS_VALID_DATA) { //this makes sure next call to ReadNextSet doesn't examine the data, and just returns null this._isLastSampleBad = true; return null; } DateTime now = (_isPreVista || returnCode == PdhResults.PDH_NO_DATA) ? DateTime.Now : new DateTime(DateTime.FromFileTimeUtc(fileTimeStamp).Ticks, DateTimeKind.Local); PerformanceCounterSample[] counterSamples = new PerformanceCounterSample[this._consumerPathToHandleAndInstanceMap.Count]; int samplesRead = 0; foreach (string key in this._consumerPathToHandleAndInstanceMap.Keys) { IntPtr counterHandle = this._consumerPathToHandleAndInstanceMap[key].CounterHandle; CounterInfo info = PdhHelper.GetCounterInfo(counterHandle); var sample = GetRawCounterSample(counterHandle, key, info, now); var performanceSample = sample.PerformanceCounterSample ?? GetFormattedCounterSample(counterHandle, key, info, sample.RawCounter); if (!this._ignoreBadStatusCodes && (performanceSample.Status != 0)) { throw BuildException(performanceSample.Status); } if (performanceSample.Status != 0) { _log.Info(() => string.Format("Status {0:x} ignored for counter {1}", performanceSample.Status, key)); continue; } counterSamples[samplesRead++] = performanceSample; } this._isLastSampleBad = false; //in the event we skipped bad data if (samplesRead < counterSamples.Length) { Array.Resize(ref counterSamples, samplesRead); } return new PerformanceCounterSampleSet(this._isPreVista ? counterSamples[samplesRead].Timestamp : now, counterSamples); }