Технологии
Решено
Поток не выводит MessageBox сообщение - вопрос №309327
Нужно проверить, соединяется ли программа с фтп сервером, создал новый поток, в нем создал обьект типа FTPClient (Пользуюсь сторонней библиотекой BytesRoad.Net.FTP), сказал программе подключаться к серверу через этот клиент, затем ввел проверку:
if (client.IsConnected == true)
MessageBox.Show(«Соединение установлено»);
Если все делать без потока — работает на ура, иначе, внутри потока — ничего не происходит. Как решить проблему?
Александр июль 21, 2012 г.
-
Всего ответов: 4
-
Лучший ответ по мнению автора
-
Сделал как там написано, ничего не проиходит при нажатии на кнопку (Повторюсь, в основном потоке все корректно работает)
-
это не то что там написано
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 я лично подозреваю что и там Вы не верно рассуждаете, но полное решение темы, без указания на грабли успешно собираемые на пути, не имеет смысла делать за один раз
-
Это я сделал перед тем, как написать прыдыдущий ответ (разница в том, что в предыдущем я просто попытался изменить текст в текстбоксе, а здесь если успешно подключится к FTP)
-
иногда я дополняю ответ после публикации, возможно вы успели прочитать раньше, повторю ps
ps это не решение вопроса с проверкой соединения ftp, это решение вопроса вызовов интерфейсных между потоками
не настроив его правильно, Вы никогда не сможете проверить логику проверки соединения ftp, просто по тому что не правильно пытаете выводить диагностическое сообщение
испытайте просто
MessageBox.Show(«бла-бла-бла»);
и
this.Dispatcher.Invoke((Action)(() => { MessageBox.Show(«бла-бла-бла»); }));
и только после того как убедитесь что умеете корректно выводить сообщения в интерфейс основного потока из дополнительного, можете продолжить изучение соединения с ftp
ps я лично подозреваю что и там Вы не верно рассуждаете, но полное решение темы, без указания на грабли успешно собираемые на пути, не имеет смысла делать за один раз
-
Андрей, я Вас понял. Дело в том, что я написал мой последний ответ, не зная, что Вы мне ответили. Я убрал все это нагромождение с ftp, отставив только MessageBox, но пока ни какого месседжбокса при нажатии на кнопку не вылазит
-
Вы создали обьект потока
Thread ConnectingToFTP = new Thread(FTPConnect);
и успокоились
есть маленький секрет )))
его еще надо было бы и запустить )))
Вы легко можете проверить (установив точку прерывания) в строку
this.Dispatcher.Invoke((Action)(() => { MessageBox.Show(«Получилось!»); }));
что туда ни когда не приходит управление
по тому и не выдается ни каких сообщений, что совершенно логично )))
Похожие вопросы
Ускорить программу на C# с использованием Windows Form. Консультация по работе с Windows Forms и serialPort
октябрь 3, 2023 г.