我是一个初学者
我正在使用C# 在dotNet Framework4.8的框架上开发一个小Demo程序,
在发布事件的类中,这个事件的定义是非静态的,没有用static关键词修饰
在订阅事件的类中,被注册的方法也是非静态的
现在在一个主要的UI窗体中,我分别为发布类和订阅类开辟了内存空间
在订阅类中的一个方法,我在一个线程中触发了事件,事件传递了四个参数,3个IntPtr类型的变量,1个结构体变量,这个线程将会在条件成立的情况下,
循环触发这个事件
现在困扰我的问题是:
程序在非人为干预下,事件会一直被触发,参数会一直被传递,并且被带离开自己原来的生命周期,如果我手动注销事件,内存会被GC在一段时间后回收,但是内存的占用会一点点的涨,
事件是不是不适用于在一个循环中被一直触发,或者说传递了参数的事件,不适用于这种被频繁触发的情况,如果我要频繁的接受一个外部设备给我传递过来的数据,我使用什么方法在不同类中处理会比较好
我是否误用了事件的功能?
如果我强制调用GC的Collect方法,vs会提示调试中断
有更好的方法来处理这种跨类的通信与数据交互吗?
谢谢!
频繁接受外部设备传输来的数据,这个通常需要做队列,队列是需要设定最大长度(队列里数据参数通常用内存池,由内存池大小确定队列大小),根据业务要求确定队列满了是不处理后来的数据还是丢弃前面最早的还没处理的数据
感觉你这是一直在new啊,你是不是没加锁?还是逻辑写错了?
这是我早期在开发过程中遇到的问题,首先很多的SDK的初始编程语言是C、C++之类的语言,它们对内存的操作,在dotNet的角度看是对非托管的资源的操作,对于非托管的资源,dotNet的垃圾回收器是不会干预的,因为这个问题过去了很久时间,我猜测可能是对非托管资源释放的操作有问题,因此非托管资源未释放才是导致内存占用率持续上升的关键,而GC往往不需要我们去手动调用,所以不执行它的Collect方法也就不会出现调试器中断的现象