using LiveCharts; using LiveCharts.Wpf; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using System.Windows.Controls; namespace FastGithub.UI { /// /// FlowChart.xaml 的交互逻辑 /// public partial class FlowChart : UserControl { private readonly LineSeries readSeries = new LineSeries { Title = "上行速率", PointGeometry = null, Values = new ChartValues() }; private readonly LineSeries writeSeries = new LineSeries() { Title = "下行速率", PointGeometry = null, Values = new ChartValues() }; public SeriesCollection Series { get; } = new SeriesCollection(); public List Labels { get; } = new List(); public Func YFormatter { get; } = value => $"{FlowStatistics.ToNetworkSizeString((long)value)}/s"; public FlowChart() { InitializeComponent(); this.Series.Add(this.readSeries); this.Series.Add(this.writeSeries); this.DataContext = this; this.InitFlowChart(); } private async void InitFlowChart() { using var httpClient = new HttpClient(); while (this.Dispatcher.HasShutdownStarted == false) { try { await this.FlushFlowStatisticsAsync(httpClient); } catch (Exception) { } finally { await Task.Delay(TimeSpan.FromSeconds(1d)); } } } private async Task FlushFlowStatisticsAsync(HttpClient httpClient) { var response = await httpClient.GetAsync("http://127.0.0.1/flowStatistics"); var json = await response.EnsureSuccessStatusCode().Content.ReadAsStringAsync(); var flowStatistics = JsonConvert.DeserializeObject(json); if (flowStatistics == null) { return; } this.textBlockRead.Text = FlowStatistics.ToNetworkSizeString(flowStatistics.TotalRead); this.textBlockWrite.Text = FlowStatistics.ToNetworkSizeString(flowStatistics.TotalWrite); this.readSeries.Values.Add(flowStatistics.ReadRate); this.writeSeries.Values.Add(flowStatistics.WriteRate); this.Labels.Add(DateTime.Now.ToString("HH:mm:ss")); if (this.Labels.Count > 60) { this.readSeries.Values.RemoveAt(0); this.writeSeries.Values.RemoveAt(0); this.Labels.RemoveAt(0); } } } }