none
Зависает приложение в потоке WPF RRS feed

  • Вопрос

  • Такая ситуация. Начал пробовать тестировать клиент, обнаружилась одна большая ошибка. В клиенте 2 окна. 1 окно подключается к серверу, создает новый класс и поток, в общем модуле устанавливает переменную - IDispatcher = Me.Dispatcher. После этого 1 окно закрывается и открывается 2. После того как приходит сообщение, вызывается событие обработки сообщения (в классе подключения) - IDispatcher.BeginInvoke(Sub() RaiseEvent ProcessCommandsCMD(strMessage)), в процедуре обработки, которая находится в общем модуле вызывается необходимая процедура обработки данных этого сообщения, которая находится во втором окне.

     Case "FS_getFIDir"

    App_Windows.General.FS_getFIDir(dataArray(1))

    или 

    IDispatcher.BeginInvoke(New Action(Sub() App_Windows.General.FS_getFIDir(dataArray(1))))

    В этой процедуре создаются и добавляются элементы, такие как кнопки, панели, сепараторы и т.д. Так вот если необходимо создать 50 таких панелей, клиент виснет на несколько секунд. Почему процедура не обрабатывается фоном? Как это исправить...

    21 января 2012 г. 12:02

Ответы

  • Добавление контрол на форму может происходить только в UI потоке, как и все взаимодействие с контролами. Из-за этого и происходит зависание интерфейса на несколько секунд.

    Это никак не должно повлиять на работу с сервером, т.к. она вынесена у вас в отдельный поток.

    Можете попробовать после каждого добавленного контрола вызвать аналог DoEvents из WinForms - Где находится Application.DoEvents в WPF?


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 9 февраля 2012 г. 8:15
    2 февраля 2012 г. 11:17

Все ответы

  • Здравствуйте.

    Проблема еще актуальна?


    Для связи [mail]
    26 января 2012 г. 14:19
  • Да, Дмитрий, помогите исправить. Ведь сервер тоже получается будет виснуть при обработке сообщений, там так-же устроено все. А сервер это уже серьезно
    27 января 2012 г. 14:30
  • Добавление контрол на форму может происходить только в UI потоке, как и все взаимодействие с контролами. Из-за этого и происходит зависание интерфейса на несколько секунд.

    Это никак не должно повлиять на работу с сервером, т.к. она вынесена у вас в отдельный поток.

    Можете попробовать после каждого добавленного контрола вызвать аналог DoEvents из WinForms - Где находится Application.DoEvents в WPF?


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 9 февраля 2012 г. 8:15
    2 февраля 2012 г. 11:17