vb.net应用程序冻结TeamViewer

时间:2014-10-25 10:37:08

标签: vb.net com hang teamviewer

我一直在研究应用程序,发现当通过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。

  1. 应用程序中的所有循环都会结束,但会经常调用。每个计时器都有1.5到5秒的重复次数,有时候计时器内的过程需要的时间超过计时时间。定时器都会调用后台工作程序并在开始进程之前检查.isBusy以避免重叠。
  2. 计时器旨在无休止地运行,但这与无限循环不同。

    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
      
    5. 模糊的主要原因是我希望TeamViewer或Radmin根据应用程序中的项目类型了解此问题。 IE SQL版本,COM端口和BW。

      提前谢谢你。

2 个答案:

答案 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,但在调试中运行时应用程序永远不会挂起。去搞清楚。

感谢您的输入人员。我希望将来可以帮助别人。我花了更多的时间来承认这个问题并且很高兴能够完成它。

如果您有任何其他意见,请告诉我。

I found this post to help with the issue

相关问题