gpt4 book ai didi

c# - IEnumerable System.ObjectDisposedException

转载 作者:太空狗 更新时间:2023-10-29 23:05:30 24 4
gpt4 key购买 nike

在某些机器上我得到 System.ObjectDisposedException 而在其他机器上没有使用这个类。

class LogComparer
{
private string firstFile;
private string secondFile;
private IEnumerable<string> inFirstNotInSecond;
private IEnumerable<string> inSecondNotInFirst;

public LogComparer(string firstFile, string secondFile)
{
if (!File.Exists(firstFile) || !File.Exists(secondFile))
{
throw new ArgumentException("Input file location is not valid.");
}
this.firstFile = firstFile;
this.secondFile = secondFile;
GenerateDiff();
}

public string FirstFile
{
get
{
return firstFile;
}
}

public bool IsEqual
{
get
{
return inFirstNotInSecond.SequenceEqual(inSecondNotInFirst);
}
}

public string SecondFile
{
get
{
return secondFile;
}
}

public IEnumerable<string> InFirstNotInSecond
{
get
{
return inFirstNotInSecond;
}
}

public IEnumerable<string> InSecondNotInFirst
{
get
{
return inSecondNotInFirst;
}
}

private void GenerateDiff()
{
var file1Lines = File.ReadLines(firstFile);
var file2Lines = File.ReadLines(secondFile);

inFirstNotInSecond = file1Lines.Except(file2Lines);
inSecondNotInFirst = file2Lines.Except(file1Lines);
}
}
System.ObjectDisposedException: Cannot read from a closed TextReader.
ObjectName:
at System.IO.__Error.ReaderClosed()
at System.IO.StreamReader.ReadLine()
at System.IO.File.<InternalReadLines>d__0.MoveNext()
at System.Linq.Enumerable.<ExceptIterator>d__99`1.MoveNext()
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate)

修改后GenerateDiff()到:

private void GenerateDiff()
{
var file1Lines = File.ReadLines(firstFile).ToList();
var file2Lines = File.ReadLines(secondFile).ToList();

inFirstNotInSecond = file1Lines.Except(file2Lines);
inSecondNotInFirst = file2Lines.Except(file1Lines);
}

我无法重现异常。

有趣的是这不起作用:

private void GenerateDiff()
{
var file1Lines = File.ReadLines(firstFile);
var file2Lines = File.ReadLines(secondFile);

inFirstNotInSecond = file1Lines.Except(file2Lines).ToList();
inSecondNotInFirst = file2Lines.Except(file1Lines).ToList();
}

我正在使用此类的实例 diff这里例如。没有 usingDispose任何地方。没有任务或线程。

if (diff.InSecondNotInFirst.Any(s => !s.Contains("bxsr")))

有人能解释一下根本原因吗?谢谢。

(我们猜测这是因为 IEnumerable<> 实现了延迟加载,垃圾收集器在我想访问 InFirstNotInSecondInSecondNotInFirst 之前关闭了读取器。但是使用 GC.Collect() 仍然没有异常机器。)

最佳答案

使用 source code我们看到 File.ReadLines 返回一个 ReadLinesIterator

here你可以看到他们在枚举后 Dispose。

这意味着使用 File.ReadLines 的枚举只能发生一次。最好使用 File.ReadAllLines,它将首先枚举并返回一个具体数组。

关于c# - IEnumerable<string> System.ObjectDisposedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42904932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com