我一直在研究应用程序,发现当通过TeamViewer和Radmin远程连接时,应用程序会冻结。
当它冻结时,没有例外,ui没有响应,并且进程不会挂起资源监视器或进程资源管理器。
该应用程序的一些基本规范: 连接到2个COM端口。一个用于输入,一个用于输出。输出COM还需要每5秒钟保持一次活动信号。 有4个后台工作线程运行各种任务,从UI更新到语音输出以及处理数据输入。 UI从3个独立的数据源实时显示数据。两个是COM端口,一个是MS SQL。
RDP根本不会挂起应用程序。
关于可能导致此问题的任何想法?
它运行在带有SQL 2012后端的VS Ultimate 2013内置的.NET 4.5.1上。
我尝试在64位和32位之间进行更改,但没有任何进展。
修改的 回应fsintegral。
计时器旨在无休止地运行,但这与无限循环不同。
有没有办法检查隐形对话框?我不相信任何存在,但我想知道如何确定。
我花了很多时间来优化每个后台工作者的数据加载时间,并将每个进程降低到不到一秒的数据加载时间。有两件事导致其中一个进程运行时间更长。其中一个是使用SpeachSynth发出警报,每个代码块最多需要60秒。另一个是电子邮件,我已将其置于异步进程中,以防止在超时时挂起应用程序。但是,即使没有处理这两个项目,应用程序也会挂起。
级联事件。这会是其他事件引发的事件吗?如果是这样,应用程序不使用此类操作。然而,该应用程序确实从至少一个后台工作者调用了大约15个单独的模块。我不相信这个数字太高,但如果是的话请告诉我。如果这是一个问题,我可以发布一些伪代码。
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。
提前谢谢你。
答案 0 :(得分:1)
汉斯帕斯特 - 正如我们有时在美国说的那样,你真是太棒了!"
太糟糕了,人们并不欣赏你所提供的东西,但这个链接,虽然对于普通的VB.NET程序员来说很复杂(我在那个类别中),是一个救生员。
我的解决方案与解决OP问题的解决方案略有不同。
我遇到了与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()
这允许在 TeamViewer 更改桌面设置(这是我的应用程序锁定时)后继续抽取Windows消息。事实证明有必要将.IsBackground
设置为True,否则表单将在退出时挂起等待某事。我知道我应该对此进行调查,但设置 IsBackgrounds 允许线程退出而不等待其他任何事情停止 - 在我离开时我真的不在乎。< / p>
仅供参考 - TeamViewer 的人绝对没有帮助。让我卸载/重新安装后,关闭DirectX - 他们无法提供任何进一步的帮助。可悲的是,我使用了几个屏幕共享解决方案,只有TeamViewer锁定了我的程序。虽然解决方案确实要修复 MY 程序,但我认为 TeamViewer 应该看看他们在连接时如何更改桌面设置。我独自花了将近两个星期的时间来处理这个问题!我使用 TeamViewer 为我的客户提供支持,以及 TeamViewer 连接或时断开连接时出现的问题。每当我提供支持时,我都会给客户留下一个锁定的程序!这让我看起来很糟糕!
答案 1 :(得分:0)
确定。我想通了。
基本上,问题的原因是这些远程查看应用程序如何影响.NET应用程序的UI。
在我的应用程序中,有两个文本框可以从应用程序中的各个线程更新。我使用以下代码更新文本。 .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需要在发布之前回发到UI,而TeamViewer正在抓取UI,使得回发永远不会被发送回UI。使用BeginInvoke,将忽略回发,因此不再使用TeamViewer无限期挂起。
感谢您关于windbg的信息。但根据您发送的文章,我无法运行它。我最终使用ProcessExplorer并创建了一个转储文件,以找出代码挂在哪一行。我尝试在调试模式下使用VS 2013,但在调试中运行时应用程序永远不会挂起。去搞清楚。
感谢您的输入人员。我希望将来可以帮助别人。我花了更多的时间来承认这个问题并且很高兴能够完成它。
如果您有任何其他意见,请告诉我。