Есть обычный таймер класса 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 - синхронно
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Отправляю асинхронный запрос к серверу следующим образом:
Нужно нарисовать треугольник у которого длина сторон и углы будут равны значениям, которые задал пользовательДумал сделать через Graphics
Столкнулся с простой задачейНужно вырезать первые два символа после точки в типе double