c# - 如何从调度程序计时器创建历史数组?C#
问题描述
基本上我必须制作一个 Dispatcher 计时器,将变量存储在数组中,然后在我单击 rawDataButton 时在文本框中显示历史数组。出于某种原因,我的数组只显示最新的,从不存储在数组中,这是我的代码
DispatcherTimer timer = new DispatcherTimer();
MeasureLengthDevice dg = new MeasureLengthDevice();
int mostRecnet = 0;
int[] arr = new int[10];
private void StartCollectingDataButton_Click(object sender, RoutedEventArgs e)
{
timer.Interval = new TimeSpan(0, 0, 1);
timer.Start();
timer.Tick += timer_Tick;
}
private void timer_Tick(object sender, object e)
{
mostRecnet = dg.GetMeasurement();
recentDataTextBlock.Text = mostRecnet.ToString();
for(int i = 0; i < arr.Length; i++)
{
arr[i] = mostRecnet;
}
}
private void stopCollectingDataButton_Click(object sender, RoutedEventArgs e)
{
timer.Stop();
}
private void rawDataButton_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < arr.Length; i++)
{
mostRecnet = arr[i];
rawDataTextBox.Text += arr[i].ToString() + "\n";
}
}
解决方案
你可以更换
int mostRecnet = 0;
int[] arr = new int[10];
并且需要手动计算一个列表和一些基本的互斥代码:
//Always use a dedicated object to lock onto
private object mutex = new object();
var History = new List<int>();
在勾选中,您执行以下操作:
lock(mutex){
History.Add(mostRecent);
}
读出来的时候,你这样做:
lock(mutex){
//do whatever you need to output the list contents
}
请注意,锁定输出将阻止处理滴答事件。尤其是对 UI 的批量写入可能需要相当长的时间,很容易在 10 到 100 毫秒之间。
推荐阅读
- c - 第一列中的用户输入值,第二列中显示多维数组的正方形
- python-3.x - 如何以原始顺序获取字典的键
- android - 在 Activity 或 Fragment 之外获取 ViewModel 实例的正确方法
- java - 使用 instanceof 扩展 java.util.Date 的掩码对象返回 true
- python - 类型错误:需要整数参数
- reactjs - 堆栈中嵌套抽屉时不显示屏幕标题
- sqlite - 使用 Xamarin.Forms 从 Sqlite 数据库中获取数据
- asp.net - 如何使用 ASP.NET 在解决方案中存储图像?
- php - 在 Woocommerce 中发送特定运输方式的订单保留电子邮件
- java - 是否可以将 LibGDX 与 MoltenGL 一起使用