多线程中的new问题
private void Listen(){
tcpl = new TcpListener(System.Net.IPAddress.Any, 4000);//在5656端口新建一个TcpListener对象
tcpl.Start();
while (true)//开始监听
{
Socket s = tcpl.AcceptSocket();
string remote = s.RemoteEndPoint.ToString();
byte[] stream = new byte[1024 * 4]; //1024* 4
System.IO.MemoryStream fs = new System.IO.MemoryStream();
int got = 0;
int datalength = 0;
while (true)
{
got = s.Receive(stream);
fs.Write(stream, 0, got);
if (got > 0)
{
datalength = datalength + got;
}
else
{
break;
}
}
Bitmap Img = new Bitmap(fs);
strPath = Application.StartupPath + "\\images\\" + string.Format("{0:yyyy/MM/dd hh:mm:ss}", DateTime.Now).Replace(' ', '\\').Replace(':', '_').Replace('/', '-') + "_s_" + strClass + "_" + strName + "_" + strModel + "_" + intTotal.ToString() + "_AT.jpg";
mypic.PicSave(Img, strPath);
fs.Close();
fs=null;
}
}
上面这段程序,在后台线程中使用,用来接收传过来的图片,并且把它保存在硬盘中。但是,new了以后, 内存中的数据无法释放,不管是close还是null,好像都没有效果。
我尝试把红色的代码移动到第一个while外面,这样导致 只能接收一张图片,其他 图片都无法接收。
困扰了2天了,有没有人知道,这个应该如何解决? --------------------编程问答-------------------- 用fs.Finalize()试下呢
--------------------编程问答-------------------- Dispose() --------------------编程问答-------------------- 好像不行。 --------------------编程问答-------------------- Dispose.
或者直接using --------------------编程问答-------------------- 使用 using把后面的代码包起来。
--------------------编程问答-------------------- using 不可以的,这个类要实现了IDispose接口才能使用using的 --------------------编程问答-------------------- 实在不行,你可以调用GC.Collect()的方法哦,只是试下哦 --------------------编程问答-------------------- 你试试把while后面的代码也放在while里面! --------------------编程问答-------------------- MemoryStream 是实现了 IDispose 接口的,可以使用 using
此外,释放文件句柄需要一点 IO 时间,可以强制 GC.Collect,还可以 GC.WaitForPendingFinalizers
Bitmap 对象也是需要 Dispose 的 --------------------编程问答-------------------- 非托管资源,你怎么能决定他放了没放呢? 就是用GCollect()也无济于事。
别管它,没问题。GC会在“适当”的时候帮你处理的。
建议,参阅一下.Net垃圾回收机制。 --------------------编程问答-------------------- 补错:“非托管资源”=》“托管资源” --------------------编程问答-------------------- 你确定你的close执行了?
我看你的代码close是不会执行的。发送端退出后,你的接收端在Receive这里就产生了异常,所以下面的close没有被执行。
程序在设计上不太合理
while(true)里面根本没有退出的地方。除非里面产生一个异常
通常的做法是所有的任务完成后发送一个<EOF>标志,客户端检测到了后就退出循环
不要指望Receive给你返回0(当然这个判断还是得要),至少我用了三年的socket从来没有遇到过。 --------------------编程问答-------------------- 加入异常处理,finally里面写上close
补充:.NET技术 , C#