Timer Thread
Разрабатываю WPF приложение. За не имением таймера в WPF использовал System.Timer.Timer объект, и добавлял метод elapsed. Но при изменении свойств контроллов в методе Tick(elapsed)вылетает ошибка:
An exception of type 'System.InvalidOperationException' occurred in WindowsBase.dll but was not handled in user code
Additional information: The calling thread cannot access this object because a different thread owns it.
Таймер и его метод создаю так:
System.Timers.Timer timer = new System.Timers.Timer(1000);
timer.Enabled = true;
timer.Elapsed += new ElapsedEventHandler(timer_Tick);
timer.Start();
private void timer_Tick(object sender,ElapsedEventArgs e)
{
waitLabel.Visibility = Visibility.Hidden;//тут вылетает ошибка
}
в чем дело?
Код:
element.Dispatcher.Invoke
Это ладно. Можно пример? Вот код, как избавиться от ошибки? Матчасть учу, но сроки поджимают
private void CreateServerButton_Click(object sender, RoutedEventArgs e)
{
try
{
CreateServerGrid.Visibility = Visibility.Hidden;
ConnectToServerGrid.Visibility = Visibility.Hidden;
waitLabel.Visibility = Visibility.Visible;
timer = new System.Timers.Timer(1000);
timer.Enabled = true;
timer.Elapsed += new ElapsedEventHandler(timer_Tick);
timer.Start();
}
catch(Exception exception)
{
MessageBox.Show("Произошла ошибка");
}
}
private void timer_Tick(object sender,ElapsedEventArgs e)
{
if(какое-то условие)
timer.Stop();
waitLabel.Visibility = Visibility.Hidden; //тут уже ошибка
MessagesGrid.Visibility = Visibility.Visible; //и тут
MessagesTextBox.Text = "Клиент подключен\n\n"; //и тут))
}
}
Цитата: ivan_kult
Хм... "каждый компонент привязан к потоку, в котором он был создан"
Это ладно. Можно пример? Вот код, как избавиться от ошибки?
Это ладно. Можно пример? Вот код, как избавиться от ошибки?
Для оформления кода есть теги [code ][/code]
Теперь по делу и закрою глаза на то, что вам лезть в МСДН лень.
Код:
private void timer_Tick(object sender,ElapsedEventArgs e) {
if(какое-то условие) {
timer.Stop();
this.Dispatcher.Invoke((Action)delegate() {
waitLabel.Visibility = Visibility.Hidden; //тут уже ошибка
MessagesGrid.Visibility = Visibility.Visible; //и тут
MessagesTextBox.Text = "Клиент подключен\n\n"; //и тут))
});
}
}
if(какое-то условие) {
timer.Stop();
this.Dispatcher.Invoke((Action)delegate() {
waitLabel.Visibility = Visibility.Hidden; //тут уже ошибка
MessagesGrid.Visibility = Visibility.Visible; //и тут
MessagesTextBox.Text = "Клиент подключен\n\n"; //и тут))
});
}
}
З.Ы. А что тема в ASP.NET делает?
з.ы.
Про МСДН.. он написан на враждебном мне басурманском языке))
Про тоему в ASP... промохнулся