我有一个SerialPort
对象。我在上面放置了一个事件处理程序,以监视处置,异常和接收到的数据事件:
mySp.DataReceived += sp_DataReceived;
mySp.ErrorReceived += sp_ErrorReceived;
mySp.Disposed += sp_Disposed;
几分钟后,我停止接收数据,但是我有充分的理由相信这与串行消息的发送者无关。
我在此应用程序中遇到问题,之前GC处置了我需要的东西(Threading.Timer
对象),因此我想确保未处置此SerialPort
。我附加了一个Disposed
处理程序,但是我刚刚读过GC不会调用Dispose
-那么如何确定是GC还是其他地方的问题?
回答问题“我如何知道我的物品是否被收集”:
其他注意事项:
使用GC,我们永远无法说它是否是或何时被收集-仅当它被[[CAN收集时。规则是“ GC可以收集所有没有对应用程序根目录进行强引用链接的内容”。如果知道了,GC将不会碰它。如果您没有它,GC可能会触摸它-最终。
运行GC非常昂贵。收集时,所有其他线程必须暂停。因此,框架懒于运行它。如果它只运行一次(在应用程序关闭时),那是理想的情况。在此之前,只有一些罕见的情况可以将其付诸实践:
[只要您对某物保持强烈引用,就无法收集它
导致像这样的GC的内存泄漏的唯一方法是忘记删除对某事物的所有强引用(大多数人忘记将其从集合中删除)
事件处理程序在设计上不算作“不间断的强引用链”。 GUI Automatics已经对显示的所有内容都有很强的参考链。
我认为您正在像这样做一些奇怪的多任务处理方式: