У меня есть многопоточное приложение C# .NET, которое замораживает интерфейс. Что необычно в этом, так это то, что интерфейс не замерзает, если я не позволяю системе простаивать достаточно долго, чтобы заставка запустилась (что требует от меня повторного ввода пароля для повторного доступа к системе). Когда интерфейс снова станет видимым (после того, как я успешно ввел свой пароль), интерфейс заблокирован. Пока я не позволяю запускать скринсейвер, интерфейс не блокируется.Интерфейс зависает в многопоточном приложении C#
Следует отметить, что у меня есть два разных исполняемых файла, которые обращаются к одной и той же DLL, и эта проблема возникает независимо от того, какое приложение я использую для доступа к DLL. Это, по-видимому, означает, что проблема связана с DLL, поскольку два приложения полностью различаются (C++/MFC) и (C# /. NET), кроме того, как они относятся к DLL.
Оба exes выполняют аналогичные шаги в том, как они взаимодействуют с DLL. Они выполняют вызовы в dll для настройки связи по последовательному порту, открывают окно состояния в DLL, запускают поток в DLL для мониторинга коммуникационного порта и затем запускают поток в основном приложении, которое контролирует стек в DLL.
Когда данные получены из коммуникационного порта потоком в DLL, он анализируется и его результаты помещаются в стек, а затем отправляются в окно состояния через делегат. Когда поток в exe видит данные в стеке, он выводит данные в главное окно, также используя делегат.
Я обнаружил, что если я добавлю код в поток внутри DLL, чтобы он вызывал Application.DoEvents() каждые 30 секунд, интерфейс будет заморожен на 30 секунд, а затем возобновит активность, как обычно. Я полагаю, что что-то блокирует основной поток и заставляет DoEvents() срабатывать, как будто разбивает блокировку, но я понятия не имею, что может вызвать эту блокировку.
Эта проблема возникает как на моей машине разработки, так и на тестовой машине.
Я попытался полностью удалить вывод данных в окно состояния внутри DLL, но это не имело никакого значения.
Я много лет проделывал многопрофильное программирование и никогда не видел ничего подобного; поэтому любой совет будет очень признателен.
Спасибо.
Приостановите замороженный пользовательский интерфейс в отладчике и посмотрите на стек вызовов. – SLaks
Вы пытались вызывать методы DLL только из потоков, отличных от UI, и сортировать их по потоку пользовательского интерфейса? – RobS
Это может быть не совсем полезно, но есть ли у вас включенное энергосбережение, которое произойдет, когда заставка запустится? (Я думаю, что это может помешать портам спать.) – vlad259