【问题标题】:VB.NET application crashes on my server if I start more than 5 threads [closed]如果我启动超过 5 个线程,VB.NET 应用程序在我的服务器上崩溃 [关闭]
【发布时间】:2017-01-14 18:49:27
【问题描述】:

如标题所示,如果我的 VB.NET 应用程序在我的服务器上运行时它有超过 5 个线程,它会在我的服务器上崩溃。

假设我有 6 个已声明的线程:

Dim Thread1 As New Threading.Thread(AddressOf NoParametersSub1)
Dim Thread2 As New Threading.Thread(AddressOf NoParametersSub2)
Dim Thread3 As New Threading.Thread(AddressOf NoParametersSub3)
Dim Thread4 As New Threading.Thread(AddressOf NoParametersSub4)
Dim Thread5 As New Threading.Thread(AddressOf NoParametersSub5)
Dim Thread6 As New Threading.Thread(AddressOf NoParametersSub6)

然后我启动前 5 个线程,它工作正常:

Thread1.Start()
Thread2.Start()
Thread3.Start()
Thread4.Start()
Thread5.Start()

每当我到达启动第 6 个线程的代码部分时:

Thread6.Start()

应用程序崩溃说“(程序集名称)已停止工作”。

无论我放置 Try/Catch 块,它都会崩溃,例如:

Try
    Thread6.Start()
Catch ex As Exception
    MsgBox(ex.Message)
End Try

或:

Try
    Thread6.Start()
Catch ex As Exception
End Try

它只是崩溃。 正如我在详细的崩溃信息中看到的那样,异常是“System.InvalidOperationException”。

我可以在这里看到:https://msdn.microsoft.com/it-it/library/fd85b3df.aspx 它说:

一个 System.InvalidOperationException 当一个方法被抛出时 当对象的状态不能支持 方法调用。

所以我放了

System.Threading.Thread.Sleep(10000)

为了等待线程正确初始化(我猜?)然后我再次尝试但它仍然崩溃。 然后我读到:

当方法试图操作 来自不是主线程或 UI 线程的线程的 UI。

但不幸的是,我并没有试图操纵 UI。

那么这里:https://msdn.microsoft.com/it-it/library/6x4c42hc(v=vs.110).aspx

无效操作异常:

这个线程是使用 ThreadStart 委托而不是 ParameterizedThreadStart 委托。

我的线程中不需要参数,但我还是尝试了:

Thread6.Start(New Object() {})

但它仍然崩溃。

崩溃过程示例:

问题签名:

问题事件名称:CLR20r3

问题签名 01:ProcessControlTest.exe

问题签名 02:1.0.0.0

问题签名 03:57cfbaee

问题特征 04:系统

问题签名 05:4.0.30319.34003

问题签名 06:522ec39f

问题签名 07:3083

问题签名 08:2f

问题签名 09:System.InvalidOperationException

操作系统版本:6.3.9600.2.0.0.272.7

区域 ID:1033

附加信息 1:5861

附加信息2:5861822e1919d7c014bbb064c64908b2

附加信息3:bb02

附加信息4:bb02c3b29c3f075104f1d0629e885cfc

服务器安装了 Windows Server 2012 R2,应用程序已使用 .NET Framework 4.5.2 编译,有 12 个内核和 4 GB 分配给进程(总共有 32 GB 的 RAM)。

我猜我的服务器中的 Windows 框架已损坏。

提前感谢您的帮助。

编辑:无论NoParametersSub6包含什么,只要我启动6个线程程序就会崩溃

【问题讨论】:

  • 这里最基本的问题是你完全不知道你的程序在哪里崩溃。而且它不是您认为的位置。每个 .NET 程序员最终都会发现,为 AppDomain.CurrentDomain.UnhandledException 事件编写事件处理程序从来都不是真正可选的。您必须拥有一个,这样您就可以在程序不再能够被调试器访问后诊断出故障。 DebugDiag 实用程序将是另一种方式,但它不能帮助用户为您解决简单的问题。
  • 无论NoParametersSub6包含什么,只要我启动6个线程,程序就会崩溃。

标签: .net vb.net multithreading crash


【解决方案1】:

在 thread.Start() 周围包装一个 try catch 对你没有帮助。异常是从您的方法 NoParametersSub6 中引发的。任何线程上未处理的异常都会使应用程序崩溃。使用一些日志记录将 try/catch 放入您的 sub 中

Private Sub NoParametersSub6()
    Try
        '... my stuff
    Catch ex As Exception
        MessageBox.Show("Thread Terminating:" & ex.ToString())
    End Try
End Sub

您应该在每个线程启动时进行某种日志记录 + 错误处理,并优雅地退出。另外,正如 Hans Prassant 所提到的,您应该处理 AppDomain.CurrentDomain.UnhandledException 以捕捉任何您未能包装的情况。

【讨论】:

  • 无论NoParametersSub6包含什么,只要我启动6个线程,程序就会崩溃。
  • 这可能是您在线程 6 中所做的任何事情都会导致另一个线程出现问题。因此,为什么您应该对所有线程进行错误处理并登录AppDomain.CurrentDomain.UnhandledException 事件处理程序。在您进行日志记录之前,您是盲目的,我们也是。
  • 我必须重复一遍:无论 NoParametersSub6 包含什么,只要我启动 6 个线程,程序就会崩溃。即使它是一个空的 Sub 它也会崩溃,只要我尝试启动第 6 个线程。
  • 我再重复一遍。放入日志记录。
【解决方案2】:

已修复

.NET Framework 在我的服务器中已损坏。 我不得不修复 .NET Framework:https://support.microsoft.com/en-us/kb/2698555

它现在就像一个魅力。

更快的修复:转到C:\Windows\Microsoft.NET\Framework\[version]\SETTINGS,删除名为ma​​chine.config 并将 ma​​chine.config.default 重命名为 ma​​chine.config,然后重新启动系统,它应该可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 2013-09-18
    • 1970-01-01
    • 2013-01-02
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    相关资源
    最近更新 更多