应用程序 (VB.Net) 在尝试调用 TcpClient.Connect(IP) API 1000 次后,由于 Mic



我遇到这个问题有一段时间了,不知道如何解决它。

该应用程序实际上是在 2013 年编码 VB.NET DLL,使用 .NET Framework 4.6.1 编译,用于通过 TCP 端口进行消息交换。

DLL 在 Win2012R2 中加载并运行,具有 .NET Framework 4.5 。DLL 运行良好,在 TCP 端口连接时没有问题。

但是,在重试打开TCP端口一段时间后,DLL崩溃了(在我记录的日志文件中,重试计数达到1000 +次)。

我试图寻找根本原因,我发现clr.dll是导致崩溃的主要原因。在其他文章中,我找到了一些信息,但似乎与我的不太相似......

下面是 Windows 事件日志供您参考。 我想知道是否有人遇到过这个问题并解决了它,请告诉我。

日志名称:应用程序
源:应用程序错误日期:
4/5/2018 2:23:48 AM 事件 ID:1000 任务类别:(100

)
级别:错误
关键字:经典 用户:
不适用 计算机:
服务器11 说明:错误 应用程序名称:MyProgram.exe,版本:
7.8.0.30,时间戳:
0x5984af0d
错误模块名称:clr.dll,版本:4.7.2053.0,时间戳:
0x58fa6bb3 异常代码:0xc00000fd
错误偏移:0x0045138d
错误进程 ID:0x1e04
错误应用程序启动时间:0x01d3cc2fb84774be
错误应用程序路径:MyProgram.exe
错误模块路径:C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
报告 ID:ef43e05d-382c-11e8-80bf-000c291e7679
错误包全名:错误包相对应用程序 ID:

从外观上看,异常代码0xc00000fd是一个StackOverflow 异常

这可能是因为递归或许多其他问题。 但是我的钱在递归上。

由于它可能是StackOverflow Expception,我认为您需要调试该过程才能正确捕获它。

从 2.0 开始,堆栈溢出异常只能在 以下情况。

  • CLR 在托管环境中运行,在该环境中,主机专门允许处理 StackOverflow 异常
  • 堆栈溢出
  • 异常是由用户代码引发的,而不是由于实际的堆栈溢出情况(参考)

源 C# 捕获堆栈溢出异常

这也值得一读 什么时候可以捕获 StackOverflowException?

简而言之,我怀疑这是 .net 本身的错误,很可能是由于您(或其他人)正在做的事情,因为您没有显示代码,我们可以假设您/他们做错了什么。

一些良好做法是

  • 当连接失败时,不要使用递归做任何愚蠢的事情。
  • 确保您始终处理和清理TcpClient或使用using语句
  • 如果您尝试同时执行操作TcpClient,请确保您没有使用Parallel.For/ForEach或任何不适合IO 绑定操作的东西,而是使用async/await模式(尽管这可能不是问题,但它的好建议)。
  • 不要盲目使用别人的图书馆

祝你好运

最新更新