Проблема с потоками wpf

83
03 февраля 2022, 00:50

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

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

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

Как мне быть?

Answer 1

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

у каждого 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 - синхронно

READ ALSO
Отобразить прогресс запроса к серверу C#

Отобразить прогресс запроса к серверу C#

Отправляю асинхронный запрос к серверу следующим образом:

81
Как нарисовать треугольник зная три стороны и все углы

Как нарисовать треугольник зная три стороны и все углы

Нужно нарисовать треугольник у которого длина сторон и углы будут равны значениям, которые задал пользовательДумал сделать через Graphics

154
Move запущенного файла

Move запущенного файла

Дано: 1Запущенная программа на C#

73
Вырезать первые два символа после точки

Вырезать первые два символа после точки

Столкнулся с простой задачейНужно вырезать первые два символа после точки в типе double

106