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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как зайти отладчиком в метод, вызываемый из другого потока 
V
    Опции темы
V0fka
Дата 18.6.2014, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Привет!

Есть WPF приложение. Есть класс наследник Window, у которого есть метод

Код

        private void HideAnim()
        {
            DoubleAnimation animation;
            Storyboard storyboardFade = new Storyboard();
            animation = new DoubleAnimation(height, 1.0, new Duration(TimeSpan.FromSeconds(this.Duration)));
            animation.Completed += (completed_o, completed_e) =>
                                        {
                                            base.Hide();
                                        };
            Storyboard.SetTargetName(animation, this.Name);
            Storyboard.SetTargetProperty(animation, new PropertyPath(Window.HeightProperty));
            storyboardFade.Children.Add(animation);
            storyboardFade.Begin(this);
        }


Есть метод Show(string body, double time) в котором включается таймер для закрытия окна

Код

...
closeTimer.Interval = time * 1000;
closeTimer.Start();


Вот метод, который срабатывает в таймере:

Код

        void closeTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            closeTimer.Stop();

            Application.Current.Dispatcher.Invoke(
                  DispatcherPriority.Background,
                  new Action(HideAnim));
        }


Проблема в том, что из таймера почему-то не срабатывает метод HideAnim().

Если его вызвать не из метода таймера - все нормально.

Если его вызвать прямо не через диспетчер из метода таймера - то в самом методе возникает исключение в this.Name (что-то о том, что из другого потока обратиться сюда нельзя). Причем исключение не валит программу, а каким-то образом подавляется. И заметил я это потому, что метод не срабатывал. Я зашел туда отладчиком и случайно увидел, что this.Name выдает исключение.

Поэтому я сделал вызов из метода таймера через диспетчер. Но он там не срабатывает. Я подозреваю, что где-то в методе опять таки выдается исключение, которое я не вижу. Но отладчик не заходит в этот метод. Даже если я там точку останова ставлю.

Вопрос: как мне попасть туда отладчиком?
PM MAIL   Вверх
Ilya81
Дата 19.6.2014, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 18.4.2014
Где: ЛО, Всеволожский р-н

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



А метод closeTimer_Elapsed завершается? В смысле до выхода из метода выполнение доходит? 

Вопрос - почему DispatcherPriority.Background? Это достаточно низкий приоритет, может, просто вызов долго не происходит.
PM MAIL ICQ Skype   Вверх
V0fka
Дата 19.6.2014, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Ilya81 @  19.6.2014,  09:38 Найти цитируемый пост)
А метод closeTimer_Elapsed завершается? В смысле до выхода из метода выполнение доходит? 

Оказывается нет.

Цитата(Ilya81 @  19.6.2014,  09:38 Найти цитируемый пост)
Вопрос - почему DispatcherPriority.Background? Это достаточно низкий приоритет, может, просто вызов долго не происходит. 

Я так скопипастил откуда-то. Попробовал вместо Background указать Send, но результат по прежнему не утешительный: выход из метода не происходит.

Причем, есть такая особенность. Если я это запускаю в той же сборке, в которой определен этот класс - то отрабатывает. Если же (собственно мне именно так и надо) я использую этот класс в другой сборке, то поведение вот так вот меняется.
PM MAIL   Вверх
Ilya81
Дата 19.6.2014, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 18.4.2014
Где: ЛО, Всеволожский р-н

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



Рекомендую в конструктор окна перед инициализацией воткнуть такие строчки:
Код

AppDomain.CurrentDomain.TypeResolve += (s, e) => 
{
 System.Diagnostics.Debug.WriteLine("Тип данных: {0} {1}", e.Name, e.RequestingAssembly);
 return null; 
};

и посмотреть, что он напишет в окно Output. А лучше и FirstChanceException до кучи, где-то что-то выведет наверняка.
PM MAIL ICQ Skype   Вверх
V0fka
Дата 22.6.2014, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ilya81, "шеф, всё пропало". Появилась проблема, которая эту проблему отодвинула, т.к. сам проект работать перестал smile . Если получится решить её и проект всё же заработает - то я обязательно попробую сделать то, что вы написали (и отпишу), спасибо!

ПС. а все же отладчиком в такие методы зайти никак нельзя?

Это сообщение отредактировал(а) V0fka - 22.6.2014, 20:17
PM MAIL   Вверх
Ilya81
Дата 23.6.2014, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 18.4.2014
Где: ЛО, Всеволожский р-н

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



Цитата(V0fka @  22.6.2014,  20:17 Найти цитируемый пост)
ПС. а все же отладчиком в такие методы зайти никак нельзя?

Цитата(V0fka @  19.6.2014,  12:46 Найти цитируемый пост)
Оказывается нет.

Мне кажется, что дело не в отладчике, а что метод просто не вызывается ни разу.
Цитата(V0fka @  19.6.2014,  12:46 Найти цитируемый пост)
Причем, есть такая особенность. Если я это запускаю в той же сборке, в которой определен этот класс - то отрабатывает. Если же (собственно мне именно так и надо) я использую этот класс в другой сборке, то поведение вот так вот меняется. 

Если такая особенность, то, скорее всего, где-то какой-то reference потерян. TypeResolve и поможет понять, какой именно. Ну и FirstChanceException выведет в т. ч. обрабатываемые исключения, из-за которых выполнение до HideAnim не доходит.
PM MAIL ICQ Skype   Вверх
V0fka
Дата 23.6.2014, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Ilya81 @  23.6.2014,  08:20 Найти цитируемый пост)
Мне кажется, что дело не в отладчике, а что метод просто не вызывается ни разу.

Понял, спасибо!

Цитата(Ilya81 @  23.6.2014,  08:20 Найти цитируемый пост)
Если такая особенность, то, скорее всего, где-то какой-то reference потерян. TypeResolve и поможет понять, какой именно. Ну и FirstChanceException выведет в т. ч. обрабатываемые исключения, из-за которых выполнение до HideAnim не доходит. 

Понял, спасибо! Если решу проблему, о которой писал выше, обязательно воспользуюсь вашим советом и отпишу по результату!
PM MAIL   Вверх
V0fka
Дата 24.6.2014, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ilya81, smile 

Благодаря вашим советам получилось найти и устранить ошибку! Дело в том, что Application.Current.Dispatcher возвращал null, в результате там было NulReferenceExeption, которого я не видел.

Что я сделал: из класса, который запускается первым взял Dispatcher.CurrentDispatcher и передал его в класс, в котором происходит вызов closeTimer_Elapsed. Он там осел в переменной disp. А в самом методе переделал вызов на 

Код

disp.Invoke(
                  DispatcherPriority.Background,
                  new Action(HideAnim))



В результате smile !
Ещё раз большое спасибо за советы и подсказки, без вас не разобрался бы!

ПС. а почему системой не ловится это NulReferenceExeption, из-за которого все эти проблемы?
PM MAIL   Вверх
Ilya81
Дата 25.6.2014, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 18.4.2014
Где: ЛО, Всеволожский р-н

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



Если версия .Net 4.5, то исключения из других потоков могут приводить не к завершению приложения, а лишь потока (конкретно Timer сам я как-то слишком редко использую, так что его особенности не помню). Включается обработка исключений из всех потоков конфигурацией
Код

<configuration> 
    <runtime> 
        <ThrowUnobservedTaskExceptions enabled="true"/> 
    </runtime> 
</configuration>

PM MAIL ICQ Skype   Вверх
V0fka
Дата 25.6.2014, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ilya81, понял, на досуге поэкспериментирую. Спасибо большое за помощь!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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