Я работал над приложением и обнаружил, что при удаленном подключении через 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,5-5-секундное повторение, и бывают случаи, когда процесс внутри таймера занимает больше времени, чем время тика. Все таймеры вызывают фонового рабочего и проверяют наличие .isBusy перед запуском процесса, чтобы избежать перекрытия.
Таймеры предназначены для бесконечной работы, но это отличается от бесконечного цикла.
Есть ли способ проверить наличие невидимых диалоговых окон? Я не верю, что они существуют, но я хотел бы знать, как убедиться.
Я потратил немало времени на оптимизацию времени загрузки данных для каждого фонового рабочего процесса и сократил время загрузки каждого процесса до менее секунды. Есть две вещи, которые заставляют один из процессов работать дольше. Один из них произносит оповещение с помощью SpeachSynth и может занимать до 60 секунд на блок кода. Другой — электронная почта, которую я поместил в асинхронный процесс, чтобы не допустить зависания приложения в случае тайм-аута. Но приложение зависает, даже когда эти два элемента не обрабатываются.
Каскадные события. Будут ли эти события вызваны другими событиями? ЕСЛИ это так, приложение не использует этот тип действия. Однако приложение вызывает около 15 отдельных модулей по крайней мере из одного из фоновых рабочих процессов. Я не считаю, что это слишком большое число, но дайте мне знать, если это так. Я могу опубликовать псевдокод, если это беспокоит.
Application.Sleep() не используется, но Application.DoEvents() используется при ожидании прохождения определенного времени.
IEDim 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.
Спасибо заранее.