Приложение vb.net зависает с TeamViewer

Я работал над приложением и обнаружил, что при удаленном подключении через TeamViewer и Radmin приложение зависает.
Когда оно зависает, исключений нет, пользовательский интерфейс не отвечает, и процесс НЕ зависает в мониторе ресурсов или проводнике процессов. .

Некоторые основные характеристики приложения: Подключается к 2 COM-портам. Один на вход, один на выход. Выходной COM также требует подтверждения активности каждые 5 секунд. Существует 4 фоновых рабочих потока, выполняющих различные задачи, от обновлений пользовательского интерфейса до речевого вывода, а также обработки ввода данных. Пользовательский интерфейс отображает данные в режиме реального времени из 3 отдельных источников данных. Два COM-порта, один MS SQL.

RDP вообще не зависает приложение.

Любые идеи о том, что может быть причиной этого?

Он работает на .NET 4.5.1, встроенном в VS Ultimate 2013, с серверной частью SQL 2012.

Я пробовал переключаться между 64-битной и 32-битной версиями без каких-либо успехов.

EDIT Ответы на fsintegral.

  1. Все циклы в приложении заканчиваются, но вызываются очень часто. Каждый таймер имеет 1,5-5-секундное повторение, и бывают случаи, когда процесс внутри таймера занимает больше времени, чем время тика. Все таймеры вызывают фонового рабочего и проверяют наличие .isBusy перед запуском процесса, чтобы избежать перекрытия.

Таймеры предназначены для бесконечной работы, но это отличается от бесконечного цикла.

  1. Есть ли способ проверить наличие невидимых диалоговых окон? Я не верю, что они существуют, но я хотел бы знать, как убедиться.

  2. Я потратил немало времени на оптимизацию времени загрузки данных для каждого фонового рабочего процесса и сократил время загрузки каждого процесса до менее секунды. Есть две вещи, которые заставляют один из процессов работать дольше. Один из них произносит оповещение с помощью SpeachSynth и может занимать до 60 секунд на блок кода. Другой — электронная почта, которую я поместил в асинхронный процесс, чтобы не допустить зависания приложения в случае тайм-аута. Но приложение зависает, даже когда эти два элемента не обрабатываются.

  3. Каскадные события. Будут ли эти события вызваны другими событиями? ЕСЛИ это так, приложение не использует этот тип действия. Однако приложение вызывает около 15 отдельных модулей по крайней мере из одного из фоновых рабочих процессов. Я не считаю, что это слишком большое число, но дайте мне знать, если это так. Я могу опубликовать псевдокод, если это беспокоит.

  4. Application.Sleep() не используется, но Application.DoEvents() используется при ожидании прохождения определенного времени.
    IE

    Dim startTime As Date = Now
    Dim timePassed As TimeSpan = Now - startTime
    Do Until timePassed.TotalSeconds > 5
       timePassed = Now - startTime
       Application.DoEvents()
    Loop
    

Основная причина неясности заключается в том, что я надеялся, что эта проблема известна TeamViewer или Radmin на основе типов элементов в приложении. Версия IE SQL, COM-порты и BW.

Спасибо заранее.


person Branden DiLorenzo    schedule 25.10.2014    source источник
comment
Некоторые подсказки, когда приложение зависает: 1) Бесконечный цикл. 2) Невидимое диалоговое окно. 3) Очень долгая загрузка данных. 4) каскадные события, запускаемые одно за другим в цикле. 5) Application.Sleep(). Итак, приостановите отладчик и используйте пошаговый построчный режим, чтобы найти проблему. Может быть где угодно; без какого-либо подозрительного кода для начала, а только с вашим очень-очень расплывчатым описанием, ничего особенного нельзя было сделать.   -  person Karl Stephen    schedule 25.10.2014
comment
Я больше не отвечаю на этот вопрос, никто никогда не говорит спасибо, когда я объясняю, что им нужно делать. Просто прочитайте blogs.msdn.com/b/dsui_team/archive/2012/10/31/   -  person Hans Passant    schedule 25.10.2014
comment
Сегодня вечером запущу Windbg, посмотрим, что получится. Спасибо Ганс!   -  person Branden DiLorenzo    schedule 26.10.2014


Ответы (2)


Ханс Пассант. Как мы иногда говорим в Америке: "Чувак, ты классный!" очень плохо, что люди не оценили то, что вы предоставили, но эта ссылка, хотя и сложная для среднего программиста VB.NET (я из этой категории), но спасает жизнь.
Мое решение оказалось немного отличным от того, что решило проблему ОП. У меня была точно такая же проблема, описанная в OP, однако переключение моих вызовов на begininvoke — это не все, что мне нужно было сделать. По вашей ссылке стало ясно, что мне нужно убедиться, что я запустил форму, которую я поместил в другую ветку, используя ApartmentSateSTA. Я не устанавливал это явно и помещал форму непосредственно в пул потоков, используя

System.Threading.ThreadPool.QueueUserWorkItem(AddressOf RunProgressForm)

Кажется, это просто использует поток MTA из пула потоков. Переключение на создание явного threading.thread и последующее использование

ProgBoxTHD = New Threading.Thread(AddressOf RunForm)
ProgBoxTHD.IsBackground = True
ProgBoxTHD.SetApartmentState(Threading.ApartmentState.STA)
ProgBoxTHD.Priority = Threading.ThreadPriority.Normal
ProgBoxTHD.Start()

Это позволило продолжить загрузку сообщений Windows после того, как TeamViewer изменит настройки рабочего стола (когда мое приложение зависнет). Также оказалось необходимым установить .IsBackground в True, иначе форма зависала на выходе в ожидании чего-то. Я знаю, что должен исследовать это, но настройка IsBackgrounds позволила потоку выйти, не дожидаясь, пока что-то еще остановится, и в тот момент, когда я выхожу, мне действительно все равно.

К вашему сведению — сотрудники TeamViewer абсолютно не помогли. После того, как я удалил / переустановил, отключил DirectX - они не смогли оказать никакой дополнительной помощи. К сожалению, я использую несколько решений для совместного использования экрана, и только TeamViewer блокировал мою программу. Хотя решение действительно состояло в том, чтобы исправить программу МОЯ, я думаю, что TeamViewer должен посмотреть, как они меняют настройки рабочего стола при подключении. Я потратил почти две недели только на одну эту ошибку! Я использую TeamViewer для поддержки своих клиентов, и проблема возникла при подключении TeamViewer или отключении. Всякий раз, когда я оказывала поддержку, я заканчивала тем, что оставляла клиента с заблокированной программой! Это только заставило меня выглядеть плохо!

person Destek    schedule 20.08.2017

Ok. Я понял.

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

В моем приложении есть два текстовых поля, которые обновляются из разных потоков в приложении. Я использовал следующий код для обновления текста. Метод .Invoke был проблемой.

    Delegate Sub SetTextCallback(ByVal [text] As String, ByRef txtHomeActiveDataStream As TextBox, ByVal type As String)
    Public Sub ReceivedText(ByVal [text] As String, ByRef txtHomeActiveDataStream As TextBox, ByVal type As String) 'input from ReadExisting
      Dim receivedString As String = text
      Dim currentText As String

      If txtHomeActiveDataStream.InvokeRequired Then
          Dim x As New SetTextCallback(AddressOf ReceivedText)
          txtHomeActiveDataStream.Invoke(x, New Object() {(text), txtHomeActiveDataStream, type})

      Else
           txtHomeActiveDataStream.Text &= receivedString 
      End If


    End Sub

Изменив метод с .Invoke на .BeginInvoke, я смог предотвратить зависание приложения. Очевидно, это связано с тем, что .Invoke требует обратной передачи в пользовательский интерфейс перед выпуском, а TeamViewer захватывает пользовательский интерфейс таким образом, что обратная передача никогда не отправляется обратно в пользовательский интерфейс. С BeginInvoke обратная передача игнорируется и, следовательно, больше не зависает на неопределенный срок с TeamViewer.

Спасибо за информацию о виндбг. Но я не смог запустить его в соответствии со статьей, которую вы прислали. В итоге я использовал ProcessExplorer и создал файл дампа, чтобы узнать, на какой строке висит код. Я пытался использовать VS 2013 в режиме отладки, но приложение никогда не зависало во время работы в режиме отладки. Иди разберись.

Спасибо за ваш вклад, ребята. Я надеюсь, что это поможет кому-то еще в будущем. Я потратил на этот вопрос больше времени, чем готов признать, и рад, что покончил с этим.

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

Я нашел этот пост, чтобы помочь с проблемой

person Branden DiLorenzo    schedule 26.10.2014