public bool IsReading { get; set; } private void Read() { var r = Data; while (IsReading) { Thread.Sleep(1000); var now = DateTime.Now; _trend = Data; ChartValues.Add(new MeasureModel { DateTime = now, Value = _trend }); SetAxisLimits(now); //lets only use the last 150 values if (ChartValues.Count > 150) ChartValues.RemoveAt(0); } }优化这段代码
时间: 2024-01-18 09:02:48 浏览: 76
这段代码的一个问题是使用了线程睡眠来等待数据的读取,这样会导致线程阻塞,影响程序响应性。另外,没有使用线程安全的集合来存储图表数据,可能会导致多线程访问冲突。
以下是对代码的优化建议:
1. 使用异步/await方式替代线程睡眠,可以使用Task.Delay()方法来实现。
2. 使用线程安全的集合来存储图表数据,如ConcurrentQueue或ConcurrentStack。
3. 将数据读取和图表更新分离为两个方法,并在数据读取完成后通过事件或委托通知图表更新。
4. 使用Dispatcher.Invoke方法将图表更新操作转移到UI线程上执行,以确保线程安全。
5. 在数据读取和图表更新的方法中添加异常处理代码,以避免程序崩溃。
优化后的代码示例:
```
private async void Read()
{
while (IsReading)
{
try
{
var now = DateTime.Now;
var trend = await Task.Run(() => Data);
_trend = trend;
ChartValues.Enqueue(new MeasureModel
{
DateTime = now,
Value = _trend
});
SetAxisLimits(now);
// lets only use the last 150 values
while (ChartValues.Count > 150) ChartValues.TryDequeue(out _);
OnDataUpdated?.Invoke(this, EventArgs.Empty);
await Task.Delay(1000);
}
catch (Exception ex)
{
// handle exception
}
}
}
public event EventHandler OnDataUpdated;
private void UpdateChart()
{
while (ChartValues.TryDequeue(out var item))
{
Application.Current.Dispatcher.Invoke(() =>
{
ChartValues.Add(item);
});
}
}
```
阅读全文