高手进~ C# 多线程处理

C#Socket通信异步多线程的。当我开60个客户端的时候,前段时间还算正常。但是后来服务器的内存持续涨。都被吃尽了,应该在什么时候,实时的将内存释放呢,或者进行垃圾回收... C# Socket通信 异步多线程的。当我开60个客户端的时候,前段时间还算正常。但是后来服务器的内存持续涨。都被吃尽了,应该在什么时候,实时的将内存释放呢,或者进行垃圾回收,又不影响数据的接收和存储。求指点,求教育! 展开
 我来答
lw2003112326
推荐于2016-11-10 · 超过43用户采纳过TA的回答
知道答主
回答量:101
采纳率:0%
帮助的人:98万
展开全部
异步多线程内存释放主要靠自己,C#的垃圾回收机制是,只有当程序段运行完毕后,垃圾回收机制才对程序开辟的内存进行垃圾回收。而多线程内的程序,特别是客户端连接,只要客户端没有断开连接,你的线程就会继续运行,除非断开客户端,线程的生命周期结束,垃圾回收机制才会对该线程产生占用的内存进行回收。如果客户端没有断开,你就要注意在线程执行的过程中去清除垃圾。
一般内存不但增大大多数是循环创建引用内存造成的,所以要留意你线程中每一个引用类型的创建。至于释放,一是在线程结束让系统自动回收,二是手动回收。但我建议你给你的数据存储区指定大小。你的数据存储应该是这样一个过程,数据存储区一般接受底端数据,一边释放过期数据。例如创建的List<string> datas = new List<string>(),控制你的最大条数是100条,那么当datas.count>100时,就remove掉多余的。
希望对你有帮助。
匿名用户
2012-11-09
展开全部
.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;

但不是所有事件绑定会造成内存泄露
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式