有一个静态方法
private static bool GetXml(string date)
{
try
{
//Подключаемся к сервису
KBODataProviderClient client = new KBODataProviderClient();
//Получаем данные
string[] result = client.getKBOContracts("2018-12-25", null);
//Если данных нет
if (result == null || result.Length <= 0)
{
log.InfoFormat("[{0}]|Pbo return 0 rows", runGuid);
return false;
}
if (File.Exists(filePath))
File.Delete(filePath);
//Сохраняем XML
using (StreamWriter sw = new StreamWriter(filePath, true, Encoding.UTF8))
{
//пишем первую запись с заголовков
sw.WriteLine("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>");
sw.WriteLine("<CONTRACTS>");
for (int i = 0; i < result.Length; i++)
{
//удаляем заголовок
string temp = result[i].Replace("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>", "");
sw.WriteLine(temp);
}
sw.WriteLine("</CONTRACTS>");
}
log.InfoFormat("[{0}]|Create XML success", runGuid);
return true;
}
catch (Exception ex)
{
log.ErrorFormat("[{0}]|GetXml error {1}", runGuid, ex + Environment.NewLine + ex.StackTrace);
return false;
}
}
当该方法被调用时,它连接到 WCF 服务,一个字符串数组来自那里(返回 string[]),然后我将其写入文件。问题是,接收到数据的时候,内存当然是吃光的,而且方法完成后,内存并没有被清空。
其实我知道string[]结果变量是一个临时变量,方法完成后应该被垃圾回收器回收,但是这并没有发生(数据占用大约400MB内存)
首先想到的是由于静态方法引起的问题。然后我决定擦链接
result = null;
GC.Collect();
并调用收集器本身。但是即使在这里效果也是0。有什么问题?
更新:
使用方法如下:
if (GetXml(date))
{
//парсинг
}
添加了这样的方法:
private static bool GetXml(string date)
{
try
{
//Подключаемся к сервису
KBODataProviderClient client = new KBODataProviderClient();
//Получаем данные
string[] result = client.getKBOContracts("2018-12-25", null);
//Если данных нет
if (result == null || result.Length <= 0)
{
log.InfoFormat("[{0}]|Pbo return 0 rows", runGuid);
return false;
}
if (File.Exists(filePath))
File.Delete(filePath);
//Сохраняем XML
using (StreamWriter sw = new StreamWriter(filePath, true, Encoding.UTF8))
{
//пишем первую запись с заголовков
sw.WriteLine("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>");
sw.WriteLine("<CONTRACTS>");
for (int i = 0; i < result.Length; i++)
{
//удаляем заголовок
string temp = result[i].Replace("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>", "");
sw.WriteLine(temp);
}
sw.WriteLine("</CONTRACTS>");
}
log.InfoFormat("[{0}]|Create XML success", runGuid);
client.Close();
client = null;
result = null;
GC.Collect();
return true;
}
catch (Exception ex)
{
log.ErrorFormat("[{0}]|GetXml error {1}", runGuid, ex + Environment.NewLine + ex.StackTrace);
return false;
}
}
我关闭了服务客户端,甚至分配了 null 以防万一。接下来,我将 null 分配给字符串并调用收集器。
结果,在接收数据时,内存增加到 320MB (+ - ofk) 并在完成后下降到 + -211 并继续工作。
解析方式不会占用这么多内存,因为解析时不接收数据,内存保持在+-60MB。
