首页 > 解决方案 > 如何从调度程序计时器创建历史数组?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";
    }
}

标签: c#arraysxamluwpdispatchertimer

解决方案


你可以更换

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 毫秒之间。


推荐阅读