Есть обычный таймер класса Timer. Каждый раз вызывается метод для отсчёта времени. И этот же метод вызывает другой метод, который обновляет значение часов в TextBox'е. Но тут всплывает ошибка:
"System.InvalidOperationException: "Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток."
В интернете прочитал, что это связанно с тем что в wpf нельзя менять значение некоторых классов. Но все найденные решения не подходят, так как у меня .NET 4.
Как мне быть?
Я решил свою проблему.
у каждого 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 - синхронно
Сборка персонального компьютера от Artline: умный выбор для современных пользователей