当前位置:编程学习 > C#/ASP.NET >>

多线程中的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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,