WPF-обновление NON UI-потоковых данных на основе статуса управления потоками UI

Я создал приложение wpf. Который имеет один флажок и две кнопки для времени запуска и остановки. После нажатия на кнопку запуска System.Timers.Timer aTimer запустится и вызовет метод checkboxstatus(), чтобы получить состояние флажка и показать его пользователю. Даже если флажок установлен, я получаю сообщение как False. Я использовал следующий код

public partial class MainWindow : Window
{  
    System.Timers.Timer aTimer = new System.Timers.Timer();
    bool ischeckboxchecked = false;

    public MainWindow()
    {
        InitializeComponent();
        aTimer.Elapsed += new ElapsedEventHandler(senddata_Tick);
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        aTimer.Interval = 3000;
        aTimer.Start();
    }
    public string checkboxstatus()
    {
        string data = string.Empty;
        ischeckboxchecked = false;
        Dispatcher.BeginInvoke((Action)(() =>
        {
            if (checkBox1.IsChecked == true)
            {
                ischeckboxchecked = true; //value is updating on each timer tick
            }
        }));
        data += ischeckboxchecked.ToString();
        return data;
    }
    private void senddata_Tick(Object sender, EventArgs args)
    {
        string postdata = string.Empty;
        postdata = checkboxstatus(); //every time am getting data as false
        MessageBox.Show(postdata);
    }
    private void button2_Click(object sender, RoutedEventArgs e)
    {
        aTimer.Stop();
    }

    private void checkBox1_Checked(object sender, RoutedEventArgs e)
    {

    }
}

любой предлагает.......

1 ответ

Решение

Вы вызываете BeginInvoke на диспетчере с вашим методом. BeginInvoke немедленно возвращается. использование Invoke вместо этого, чтобы получить блокирующий вызов и вернуться только после Dispatcher операция завершена.

Другие вопросы по тегам