Технологии

Решено

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

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

if (client.IsConnected == true) 

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

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

Александр июль 21, 2012 г.

  • Всего ответов: 4

  • Андрей FaceOff - аватарка

    Андрей FaceOff

    1-й в Технологиях

    http://miptleha.blogspot.com/2011/02/wpf.html

    июль 21, 2012 г.
    Ответ понравился автору
    Лучший ответ по мнению автора
  • Александр - аватарка

    Александр

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

    июль 22, 2012 г.
  • Андрей FaceOff - аватарка

    Андрей FaceOff

    1-й в Технологиях

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

    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, 2012 г.
  • Александр - аватарка

    Александр

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

    июль 22, 2012 г.
  • Андрей FaceOff - аватарка

    Андрей FaceOff

    1-й в Технологиях

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

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

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

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

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

    и

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

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

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


    июль 22, 2012 г.
  • Александр - аватарка

    Александр

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

     

    июль 22, 2012 г.
  • Андрей FaceOff - аватарка

    Андрей FaceOff

    1-й в Технологиях

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

    Thread ConnectingToFTP = new Thread(FTPConnect);

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

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

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

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

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

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

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

    июль 22, 2012 г.

Похожие вопросы

судебная экспертиза

март 14, 2023 г.

Технологии