【发布时间】:2020-05-31 12:12:13
【问题描述】:
我有一个SerialPort 对象。我已经为此放置了一个事件处理程序来监控处置、异常和接收到的数据事件:
mySp.DataReceived += sp_DataReceived;
mySp.ErrorReceived += sp_ErrorReceived;
mySp.Disposed += sp_Disposed;
几分钟后我停止接收数据,但我有充分的理由相信这不是串行消息发送者的问题。
我之前在这个应用程序中遇到过问题,因为 GC 处理了我需要的东西(Threading.Timer 对象),所以我想确保这个 SerialPort 没有被处理。我附加了一个 Disposed 处理程序,但我刚刚读到 GC 不会调用 Dispose - 那么我如何判断它是 GC 还是其他地方的问题?
【问题讨论】:
-
订阅事件不会使对象保持活动状态,所以是的,如果您不在某处保留对它的引用,它将被 GC 收集。我会找到一个正确答案的链接。编辑:this 有帮助吗?
-
导致问题的不是 GC。可能不会在一个块上接收到消息。使用异步串行端口时,Windows 中使用时间来发送接收数据。因此,您的代码必须能够等到收到完整的消息。您有一个主/从通信系统。您的代码是主机(客户端),设备是从机(服务器)。除非服务器收到消息并发送响应,否则您不会收到消息。您的代码挂起,但绝对不是因为垃圾收集。
-
如果串行端口超出范围,它们应该被丢弃。只是问这个问题表明你没有这样做。开放端口是非托管资源。对于那些规则是:“创建。使用。处置。所有在同一段代码中,理想情况下使用 using 块。” docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
-
@Christopher - 不过,我需要让这些通讯“永远”保持打开状态。我没有自己处理它们的奢侈,因为我不想错过任何一条消息,这是作为 Windows 服务的一部分,它可以不间断地运行。基本上,这是一种监视串行端口的消息并立即显示它们的服务。
标签: c# .net garbage-collection serial-port dispose