日期:2014-05-17  浏览次数:20837 次

WINFORM 线程中whlie(true)循环调用WEB服务,内存一直慢慢增加
方法大概是这样的:
void SendMsg()
{
   while(true)
   {
       //将XML文件打包,里面有图片,转为字符串后比较大      
       //通过WEB服务上传
       Sleep(5000);
   }
}
内存一直增加,最大时候有100多兆,后来我通过GC手动回收,但是回收后,内存刚开始变小了,但是增加的更快了。
有没有一个清理内存的好方法,还有,while循环里面每次都new XML(),还有些临时变量,会有什么影响呢?

------解决方案--------------------
比如你上传的时候使用的WebClient或者WebHTTPRequest类   

每次循环结束后设置为null,或者用Gc.SuppressFinalize释放资源。

dispose和using都可以释放。

方法很多~
------解决方案--------------------
简单的看了
while(true)里每次操作的都是gispartdischarge.xml文件
为什么不把处理xml的代码放到while(true)外面呢?
InvokeWebService方法的第三个参数是String类型
应该可以直接拼接成XML
无需SetAttribute(),xe3.InnerText=xxxx之后再来一次args[0] = xmlDoc.OuterXml;


------解决方案--------------------
WebService 基于Socket通信。
在GC中,只能回收 托管资源。而如,Socket连接,数据库连接,文件句柄等等,都叫非托管资源。
GC没有能力去回收这些资源。所以尽管你GC.Collet();无限次,也是无法阻止内存泄露的。

Microsoft也考虑到这一点,建议使用using块来回收 非托管资源。

如:using(FileStream stream =..;......){...........}

using 块执行完毕,自动调用对象的Dispose方法来释放资源。

也可以使用try{....}finally{ o.Dispose(); o.Close();}

LZ,随意选吧.....

------解决方案--------------------
把所有,涉及到Stream , 网络连接,IO流操作,文件句柄都使用using(){}括起来 

如:

wc = new WebClient();
                stream = wc.OpenRead(url + "?WSDL");
                ServiceDescription sd = ServiceDescription.Read(stream);

网络连接:
using(wc = new WebClient())
{
    using(stream = wc.OpenRead(url + "?WSDL"))
    {
       using(ServiceDescription sd = ServiceDescription.Read(stream))
       {
           ........ ...省略
           using(csc = new CSharpCodeProvider())
           {
               ..............省略
           }
       }
    }
}

最后如果再来个GC.Collect();

------解决方案--------------------
内存增加主要是这个方法  object obj = WebServicesHelper.InvokeWebService(url, method, args); 
你是用动态调用WebService,也就是每次都要Locd DLL 然后反射。。这个资源是相当大的。建议改成
直接用VS的WebService引用 然后只要