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引用 然后只要