Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> System.Threading.Timer, После Dispose работает TimerCallBack. 
V
    Опции темы
nikakoi
Дата 13.11.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.5.2006

Репутация: нет
Всего: нет



Добрый день.
У меня возникла следующая проблема.
Используя Threading.Timer при завершении работы приложения делаю ему Dispose(). 
Но каким то образом приложение падает в TimerCallBack функции.
Не мог бы мне кто нибудь объяснить как такое возможно?
PM MAIL   Вверх
stab
Дата 13.11.2007, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Похоже на ошибку синхронизации, выкладывай код.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
nikakoi
Дата 13.11.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.5.2006

Репутация: нет
Всего: нет



Код

Control(Constrol owner)
{
  timer = new System.Threading.Timer(TimerTick, null, 0, 200);
}

private void TimerTick(object sender)
{
  if (owner.IsDisposed)
    return;

  if (owner.InvokeRequired && !disposing)
  {
    owner.Invoke(new TimerCallback(this.TimerTick), sender);
    return;
  }

  if (!Visible)
    return;

  if (isMouseDown)
  {
    return;
  }

  if (IsMouseOverControl())
  {
    timerCounter = 0;
    return;
  }

  timerCounter++;

  if (timerCounter > 4)
  {
    Visible = false;
    otherControl.Visible = true;

    Owner.Dosmth(true);

    timerCounter = 0;
  }
}

public void Dispose()
{
  disposing = true;
  timer.Dispose();
}

...


и у owner в методе Dispose вызываю Dispose этого контрола.

Это сообщение отредактировал(а) nikakoi - 13.11.2007, 16:16
PM MAIL   Вверх
stab
Дата 13.11.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Цитата(nikakoi @  13.11.2007,  20:15 Найти цитируемый пост)
 if (owner.InvokeRequired && !disposing)

Сюда попадает при входах после Dispose?

В общем, я бы на всякий случай обернул всю с работу в TimerTick и Dispose в lock(timer) { ... }.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
nikakoi
Дата 13.11.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.5.2006

Репутация: нет
Всего: нет



Сложно понять попадает ли туда. Баг воспроизводится не всегда, поэтому дебажить не получается. Только вот если я правильно понял lock следит за тем, чтобы работал только один поток. А мне как раз нужно чтобы у меня таймер работал в отдельном потоке от основного.
Ну если я правильно понял что такое lock, конечно:(

Это сообщение отредактировал(а) nikakoi - 13.11.2007, 16:34
PM MAIL   Вверх
stab
Дата 13.11.2007, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Дык Dispose вызывается всего один раз за время жизни приложения\формы\контрола, ощутимых потоковых коллизий это не даст, так что у тебя будет второй "поток" нормально работать. Кроме того он по Invoke вызывает код, т.е. многопоточности тут, по сути, нет.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
stab
Дата 13.11.2007, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



.. стоп, всё в TimerTick не надо оборачивать в lock, только обращения к disposing. Лучше наверное вообще все обращения к этому полю делать через свойство, там как раз вставить lock.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
nikakoi
Дата 13.11.2007, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.5.2006

Репутация: нет
Всего: нет



Угу=) Спасибо огромное... Так и сделал))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.