0

Есть обычный таймер класса Timer. Каждый раз вызывается метод для отсчёта времени. И этот же метод вызывает другой метод, который обновляет значение часов в TextBox'е. Но тут всплывает ошибка:

"System.InvalidOperationException: "Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток."

В интернете прочитал, что это связанно с тем что в wpf нельзя менять значение некоторых классов. Но все найденные решения не подходят, так как у меня .NET 4.

Как мне быть?

zodiak1
  • 129

1 Answers1

0

Я решил свою проблему.

у каждого UIЭлемнта есть свойство Dispatcher. И уже у него есть пара методов BeginInvoke и Invoke, в которые нужно передать делегат не принимающий параметров. И уже в нём выполнять изменение wpf-элемента.

Пример моего кода

    private delegate void TimeOutput(); //Делегат, передаваемый в метод Dispatcher.BeginInvoke

    private void DecreaseTime(object obj)
    {
        //Уменьшаю таймер

        TimerOutputField.Dispatcher.BeginInvoke(new TimeOutput(OutputTimeLeft)); //TimerOutputField - имя моего TextBlock
    }
    // А этот метод используется в качестве экземпляра передаваемого делегата TimeOutput
    private void OutputTimeLeft()
    {
        TimerOutputField.Text = TimeLeft.ToString();
    }

P.S BeginInvoke и Invoke отличаются тем, что BeginInvoke выполняет работу асинхронно, а Invoke - синхронно

zodiak1
  • 129