Поток не выводит MessageBox сообщение - вопрос №309327

Нужно проверить, соединяется ли программа с фтп сервером, создал новый поток, в нем создал обьект типа FTPClient (Пользуюсь сторонней библиотекой BytesRoad.Net.FTP), сказал программе подключаться к серверу через этот клиент, затем ввел проверку:

if (client.IsConnected == true) 

    MessageBox.Show(«Соединение установлено»);

Если все делать без потока — работает на ура, иначе, внутри потока — ничего не происходит. Как решить проблему? 

22.07.12
4 ответа

Лучший ответ по мнению автора

22.07.12
Лучший ответ по мнению автора

Другие ответы

Сделал как там написано, ничего не проиходит при нажатии на кнопку (Повторюсь, в основном потоке все корректно работает)

изображение из вопроса

22.07.12

это не то что там написано

Dispatcher.Invoke применяется не для создания потока

а для обращения из потока к основному потоку в котором работает обычно вес интерфейс

все что требовалось, это изменить код приведенный выше (если это был код исполняемый в дополнительном потоке, что следует из Вашего вопроса)

if (client.IsConnected == true) 

    MessageBox.Show(«Соединение установлено»);

на

if (client.IsConnected == true) 

    this.Dispatcher.Invoke((Action)(() => { MessageBox.Show(«Соединение установлено»); }));

все. больше ни чего изобретать не надо

суть в том что этот (Ваш) фрагмет кода исполняется в дополнительном потоке, а инфраструктура обслуживающая MessageBox.Show() в основном, прямой вызов между потоками не корректен

ps это не решение вопроса с проверкой соединения ftp, это решение вопроса вызовов интерфейсных между потоками

не настроив его правильно, Вы никогда не сможете проверить логику проверки соединения ftp, просто по тому что не правильно пытаете выводить диагностическое сообщение

испытайте просто

    MessageBox.Show(«бла-бла-бла»);

и

    this.Dispatcher.Invoke((Action)(() => { MessageBox.Show(«бла-бла-бла»); }));

и только после того как убедитесь что умеете корректно выводить сообщения в интерфейс основного потока из дополнительного, можете продолжить изучение соединения с ftp

ps я лично подозреваю что и там Вы не верно рассуждаете, но полное решение темы, без указания на грабли успешно собираемые на пути, не имеет смысла делать за один раз



22.07.12

Это я сделал перед тем, как написать прыдыдущий ответ (разница в том, что в предыдущем я просто попытался изменить текст в текстбоксе, а здесь если успешно подключится к FTP)

изображение из вопроса

22.07.12

иногда я дополняю ответ после публикации, возможно вы успели прочитать раньше, повторю ps

ps это не решение вопроса с проверкой соединения ftp, это решение вопроса вызовов интерфейсных между потоками

не настроив его правильно, Вы никогда не сможете проверить логику проверки соединения ftp, просто по тому что не правильно пытаете выводить диагностическое сообщение

испытайте просто

    MessageBox.Show(«бла-бла-бла»);

и

    this.Dispatcher.Invoke((Action)(() => { MessageBox.Show(«бла-бла-бла»); }));

и только после того как убедитесь что умеете корректно выводить сообщения в интерфейс основного потока из дополнительного, можете продолжить изучение соединения с ftp

ps я лично подозреваю что и там Вы не верно рассуждаете, но полное решение темы, без указания на грабли успешно собираемые на пути, не имеет смысла делать за один раз


22.07.12

Андрей, я Вас понял. Дело в том, что я написал мой последний ответ, не зная, что Вы мне ответили. Я убрал все это нагромождение с ftp, отставив только MessageBox, но пока ни какого месседжбокса при нажатии на кнопку не вылазит

изображение из вопроса 

22.07.12

Вы создали обьект потока

Thread ConnectingToFTP = new Thread(FTPConnect);

и успокоились

есть маленький секрет )))

его еще надо было бы и запустить )))

Вы легко можете проверить (установив точку прерывания) в строку

this.Dispatcher.Invoke((Action)(() => { MessageBox.Show(«Получилось!»); }));

что туда ни когда не приходит управление

по тому и не выдается ни каких сообщений, что совершенно логично )))

22.07.12
Посмотреть всех экспертов из раздела Технологии > .Net/C#
Пользуйтесь нашим приложением Доступно на Google Play Загрузите в App Store