我一直在开发一个应用程序,发现当通过 TeamViewer 和 Radmin 远程连接时,应用程序会冻结。
当它冻结时,没有异常,用户界面没有响应并且进程不会挂在资源监视器或进程资源管理器中。
应用程序的一些基本规格: 连接到 2 个 COM 端口。一个输入,一个输出。输出 COM 还需要每 5 秒发出一次保持活动信号。有 4 个后台工作线程运行从 UI 更新到语音输出以及处理数据输入的各种任务。UI 实时显示来自 3 个独立数据源的数据。两个是 COM 端口,一个是 MS SQL。
RDP 根本不会挂起应用程序。
关于可能导致这种情况的任何想法?
它在带有 SQL 2012 后端的 VS Ultimate 2013 中内置的 .NET 4.5.1 上运行。
我也尝试在 64 位和 32 位之间进行更改,但也没有任何进展。
编辑 对 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。
提前谢谢你。