高手进~ C# 多线程处理

2025-06-28 17:38:54
推荐回答(2个)
回答1:

异步多线程内存释放主要靠自己,C#的垃圾回收机制是,只有当程序段运行完毕后,垃圾回收机制才对程序开辟的内存进行垃圾回收。而多线程内的程序,特别是客户端连接,只要客户端没有断开连接,你的线程就会继续运行,除非断开客户端,线程的生命周期结束,垃圾回收机制才会对该线程产生占用的内存进行回收。如果客户端没有断开,你就要注意在线程执行的过程中去清除垃圾。
一般内存不但增大大多数是循环创建引用内存造成的,所以要留意你线程中每一个引用类型的创建。至于释放,一是在线程结束让系统自动回收,二是手动回收。但我建议你给你的数据存储区指定大小。你的数据存储应该是这样一个过程,数据存储区一般接受底端数据,一边释放过期数据。例如创建的List datas = new List(),控制你的最大条数是100条,那么当datas.count>100时,就remove掉多余的。
希望对你有帮助。

回答2:

.NET的垃圾回收是自动的,当机器的内存有压力时会被自动触发。而没有人知道是什么时候。

.NET的开发人员不主张程序员自己使用GC.Collect()进行垃圾回收。
如果一定要使用,需要两次GC.Collect();
第一次寻找可以被回收的资源,并把他们放置到“准备好被回收”的队列了
第二次施放这个“准备好被回收”列队里的所有元素

如果内存持续上升,可以使着看看自己的代码有没有造成内存泄露。
比如哪些有IDisposable的类Open以后没有被Close或者Dispose,这是造成内存流失的原因之一
Socket类本身也implement了IDisposable,所以使用的时候注意有没有close()
或者用(using Socket socket = new Socket()){
//代码

}
被包含在using语句中的部分.NET会自动Dispose,不会造成潜在内存流失

另一个可能造成内存流失的原因是 事件绑有其他方法,但在不使用以后没有取消邦定
(不好意思,我表达的不是很好)
比如 Loaded += OnLoaded;

private void OnLoaded (object sender, RoutedEventArgs e) {
// 代码

}
以下习惯也可以某种程度上的降低内存泄露
Loaded -= OnLoaded;

但不是所有事件绑定会造成内存泄露