private static async void SendReportLoop() { while (true) { // собираем данные // диски List <DriveInfo> drives = DriveInfo.GetDrives().Where(d => d.IsReady).ToList(); var totalDiskSpace = drives.Sum(d => d.TotalSize / 1024 / 1024); var freeDiskSpace = drives.Sum(d => d.AvailableFreeSpace / 1024 / 1024); var disksInfo = new DisksInfo { TotalMb = (int)totalDiskSpace, FreeMb = (int)freeDiskSpace }; // ОЗУ var ramInfo = new RAMInfo(); if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { ramInfo = GetUnixMetrics(); } else { ramInfo = GetWindowsMetrics(); } // ЦП var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total", true); var value = cpuCounter.NextValue(); if (Math.Abs(value) <= 0.00) { value = cpuCounter.NextValue(); } var cpuInfo = new CPUInfo { UsedPercent = (int)value }; // подготавливаем данные var data = new SystemReportDto { DisksInfo = disksInfo, RAMInfo = ramInfo, CPUInfo = cpuInfo }; // отправляем данные на сервер Console.WriteLine($"{DateTime.Now}: отправка данных на сервер."); if (_HubConnection.State != HubConnectionState.Connected) { await _HubConnection.StartAsync(); } await _HubConnection.SendAsync("SendSystemReport", data); Thread.Sleep(_delaySeconds * 1000); } }
/// <summary> /// добавляет в базу новый отчёт, либо обновляет уже имеющийся /// </summary> /// <param name="address">IP - адрес</param> /// <param name="ramInfo">информация об ОЗУ</param> /// <param name="cpuInfo">информация о ЦП</param> /// <param name="disksInfo">информация о дисках</param> public async Task <bool> StoreSystemReport(string address, RAMInfo ramInfo, CPUInfo cpuInfo, DisksInfo disksInfo) { var result = false; if (string.IsNullOrEmpty(address) || ramInfo == null || cpuInfo == null || disksInfo == null) { return(false); } var id = 0; using (NpgsqlConnection conn = GetConnection(_conn)) { using (var cmd = new NpgsqlCommand(GetIdQuery(), conn)) { cmd.Parameters.AddWithValue("p_address", address); try // ищем id { await conn.OpenAsync(); var searchResult = await cmd.ExecuteReaderAsync(); if (searchResult.HasRows) { await searchResult.ReadAsync(); id = (int)searchResult[0]; } await conn.CloseAsync(); } catch (Exception e) { return(false); } cmd.Parameters.AddWithValue("p_total_ram", ramInfo.TotalMb); cmd.Parameters.AddWithValue("p_free_ram", ramInfo.FreeMb); cmd.Parameters.AddWithValue("p_cpu_load", cpuInfo.UsedPercent); cmd.Parameters.AddWithValue("p_free_disks", disksInfo.FreeMb); cmd.Parameters.AddWithValue("p_total_disks", disksInfo.TotalMb); try { if (id > 0) // если уже есть в базе, то обновляем { cmd.Parameters.AddWithValue("p_id", id); cmd.CommandText = GetUpdateSystemReportQuery(); await conn.OpenAsync(); await cmd.ExecuteNonQueryAsync(); await conn.CloseAsync(); } else // иначе добавляем в бд { cmd.CommandText = GetInsertSystemReportQuery(); await conn.OpenAsync(); await cmd.ExecuteNonQueryAsync(); await conn.CloseAsync(); } result = true; } catch (Exception e) { result = false; } } await conn.CloseAsync(); } return(result); }