Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Timer Thread

42K
14 февраля 2010 года
ivan_kult
27 / / 12.12.2009
Доброго времени суток.

Разрабатываю 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;//тут вылетает ошибка
}

в чем дело?
5
14 февраля 2010 года
hardcase
4.5K / / 09.08.2005
Стандартный WinForms таймер работает на сообщениях Windows. WPF, сами понимаете, не использует явно эту очередь, потому компоненты таймера нету, впрочем, System.Threading.Timer с лихвой покрывает его функционал. По аналогии с WinForms подходом в WPF каждый компонент привязан к потоку, в котором он был создан. Если WinForms для доступа к компоненте из иного потока требовалось вызывать метод Invoke, то в WPF для этого существует диспетчер с аналогичным методом:
 
Код:
element.Dispatcher.Invoke
42K
14 февраля 2010 года
ivan_kult
27 / / 12.12.2009
Хм... "каждый компонент привязан к потоку, в котором он был создан"

Это ладно. Можно пример? Вот код, как избавиться от ошибки? Матчасть учу, но сроки поджимают

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"; //и тут))
}
}
5
14 февраля 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: 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"; //и тут))            
        });
    }            
}


З.Ы. А что тема в ASP.NET делает?
42K
14 февраля 2010 года
ivan_kult
27 / / 12.12.2009
Спасибо.
з.ы.
Про МСДН.. он написан на враждебном мне басурманском языке))
Про тоему в ASP... промохнулся
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог