Есть обычный таймер класса 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 - синхронно
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Отправляю асинхронный запрос к серверу следующим образом:
Нужно нарисовать треугольник у которого длина сторон и углы будут равны значениям, которые задал пользовательДумал сделать через Graphics
Столкнулся с простой задачейНужно вырезать первые два символа после точки в типе double