我怎么知道我的串行通讯是否被GC关闭了?

问题描述 投票:0回答:2

我有一个SerialPort对象。我在上面放置了一个事件处理程序,以监视处置,异常和接收到的数据事件:

mySp.DataReceived += sp_DataReceived;
mySp.ErrorReceived += sp_ErrorReceived;
mySp.Disposed += sp_Disposed;

几分钟后,我停止接收数据,但是我有充分的理由相信这与串行消息的发送者无关。

我在此应用程序中遇到问题,之前GC处置了我需要的东西(Threading.Timer对象),因此我想确保未处置此SerialPort。我附加了一个Disposed处理程序,但是我刚刚读过GC不会调用Dispose-那么如何确定是GC还是其他地方的问题?

c# .net garbage-collection serial-port dispose
2个回答
0
投票

回答问题“我如何知道我的物品是否被收集”:

  1. 检查代码。确保保留对有关对象的引用。
  2. 您可以包装对象并将finalizer添加到包装器。如果到达终结器,则知道将要收集对象。
  3. 使用内存分析器。这使您可以捕获快照并搜索内存中的对象数量。这样,您可以查看所使用的任何对象是否存在。我不知道有任何有效的免费替代方案,但通常有商业系统的试用版。

其他注意事项:

  1. 请确保您注意任何异常情况和发生的其他错误。某些API具有事件或其他扩展点,您可以在其中侦听问题。这可能表明是否存在导致消息停止的内部问题。
  2. 不确定串行通信使用的是什么,但是某些库甚至驱动程序可能不可靠。切换版本甚至硬件以查看是否可以避免此问题可能是一个主意。

0
投票

使用GC,我们永远无法说它是否是或何时被收集-仅当它被[[CAN收集时。规则是“ GC可以收集所有没有对应用程序根目录进行强引用链接的内容”。如果知道了,GC将不会碰它。如果您没有它,GC可能会触摸它-最终。

运行GC非常昂贵。收集时,所有其他线程

必须暂停。因此,框架懒于运行它。如果它只运行一次(在应用程序关闭时),那是理想的情况。在此之前,只有一些罕见的情况可以将其付诸实践:

    OOM异常的危险。在这些发生之前,GC将收集所有可能的东西。
  • 手动调用
  • 各种优化。就像尝试收集刚刚完成的函数中创建的所有内容。
  • 关于您的问题:

    [只要您对某物保持强烈引用,就无法收集它

  • 如果您有很好的参考,GC必须假定您正在对其进行处理,并且不应删除它。

    导致像这样的GC的内存泄漏的唯一方法是忘记删除对某事物的所有强引用(大多数人忘记将其从集合中删除)

    事件处理程序在设计上不算作“不间断的强引用链”。 GUI Automatics已经对显示的所有内容都有很强的参考链。

    我认为您正在像这样做一些奇怪的多任务处理方式:

      您创建实例
    • 您注册事件
    • 您的参考文献不多
  • 这不起作用。您需要使用正确的多任务处理方式-理想情况下使用一些阻止或轮询代码-来处理它们。这也将使您能够从SerialPorts中获取异常。
  • © www.soinside.com 2019 - 2024. All rights reserved.