【发布时间】:2018-02-23 12:12:44
【问题描述】:
使用using 语句的以下代码旨在避免某种内存泄漏,这会导致代码在长文件中变慢:
var db = new EntityContext();
var cubos = db.CubosTrabalhados;
var cubo = new CuboTrabalhado();
string[] lines = File.ReadAllLines(Files.cuboHistorico, Encoding.Default);
bool header = true;
int i = 2;
foreach (string line in lines)
{
if (header) header = false;
else
{
using (var reg = line.Split(';'))
{
cubo.Pedido = reg[0];
cubo.DataPedido = Select.ParseDate(reg[3]);
cubo.Cliente = reg[4];
cubo.UF = Select.Uf(reg[5]);
cubo.Cidade = reg[6];
cubo.Regiao = reg[7];
cubo.Codigo = reg[8];
cubo.Produto = reg[9];
...
cubo.VlCom = Select.ParseFloat(reg[63]);
cubo.Cnpj = reg[64];
cubo.CodProdOriginal = reg[65];
cubos.Add(cubo);
db.SaveChanges();
}
}
}
但是带有using 语句的行给出了错误:
'string[]': 在 using 语句中使用的类型必须是隐式的 可转换为“System.IDisposable”
由于Split 是.net 的常规部分,我不知道在这种情况下如何实现IDisposable 接口。
它是如何工作的?
【问题讨论】:
-
只需删除
using,除非您在某处保存对reg的引用,否则拆分字符串不会导致内存泄漏。 -
您不需要处理字符串数组。这就是垃圾收集器的工作
-
using在这种情况下完全没用。 -
在这种情况下需要处理的是 DbContext,而不是字符串数组。
-
这很慢,因为您正在为每一行写入数据库。将您的数据库保存更改放在每个循环之外。您已经跟踪了
cubos。