Как мне сделать массив истории из диспетчерского таймера? C # - PullRequest
1 голос
/ 26 октября 2019

По сути, я должен сделать таймер 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";
    }
}

1 Ответ

0 голосов
/ 27 октября 2019

Вы можете заменить

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
}

Имейте в виду, что блокировка для вывода предотвратит обработку события тика. И особенно массовые записи в пользовательский интерфейс могут занимать значительное количество времени, легко в 10–100 миллисекунд.

...