gpt4 book ai didi

c# - Parallel.ForEach 和无法从关闭的 TextReader 异常中读取

转载 作者:太空宇宙 更新时间:2023-11-03 22:07:19 25 4
gpt4 key购买 nike

我有一个包含各种提要 URL 的文本文件。我正在使用以下代码读取集合 (IEnumerable) 中的所有 URL:

var URLs = File.ReadLines(Path.GetFullPath(@"Resources\FeedList.txt"));

在下一行中,我将打印总数:

Console.WriteLine("Total Number of feeds : {0}",URLs.Count());

然后我使用 Parellel.ForEach 构造来执行一些逻辑,对应于每个 URL。以下是代码,我正在使用:

Parallel.ForEach(URLs, (url) =>
{
// Some business logic
});

问题是,我得到以下异常,只要我添加代码来打印 URL 的数量,即调用 URL 对象上的 Count() 方法的代码。异常:

Total Number of feeds : 78

Unhandled Exception: System.AggregateException: One or more errors occurred. ---> System.ObjectDisposedException: Cannot read from a closed TextReader.
at System.IO.__Error.ReaderClosed()
at System.IO.StreamReader.ReadLine()
at System.IO.File.<InternalReadLines>d__0.MoveNext()
at System.Collections.Concurrent.Partitioner.DynamicPartitionerForIEnumerable`1.InternalPartitionEnumerator.GrabNextChunk(Int32 requestedChunkSize)
at System.Collections.Concurrent.Partitioner.DynamicPartitionEnumerator_Abstract`2.MoveNext()
at System.Threading.Tasks.Parallel.<>c__DisplayClass32`2.<PartitionerForEachWorker>b__30()
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask)
at System.Threading.Tasks.Task.<>c__DisplayClass7.<ExecuteSelfReplicating>b__6(Object )
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Parallel.PartitionerForEachWorker[TSource,TLocal](Partitioner`1 source, ParallelOptions parallelOptions, Action`1 simpleBody, Action`2 bodyWi
at System.Threading.Tasks.Parallel.ForEachWorker[TSource,TLocal](IEnumerable`1 source, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Action`3
at System.Threading.Tasks.Parallel.ForEach[TSource](IEnumerable`1 source, Action`1 body)
at DiscoveringGroups.Program.Main(String[] args) in C:\Users\Pawan Mishra\Documents\Visual Studio 2010\Projects\ProgrammingCollectiveIntelligence\DiscoveringGroups\Pro
Press any key to continue . . .

如果我删除/注释掉打印计数值的行,Parallel.ForEach 循环运行良好。

有人知道这里出了什么问题吗?

最佳答案

不要使用 var当你不需要时(或者当类型明显多余时)。在这种情况下,它隐藏了正在发生的事情,你会对结果感到惊讶。

File.ReadLines方法不会读取所有行并返回一个集合,它会返回一个枚举器,当您从中获取项目时,该枚举器会读取这些行。它返回的类型不是字符串数组,而是一个IEnumerable<string>。 ,如果您指定了变量的类型,您会注意到这一点:

string[] URLs = File.ReadLines(Path.GetFullPath(@"Resources\FeedList.txt"));

这会产生编译器错误,因为该方法不返回数组,因此您会发现结果不是您所期望的。

当您使用 Count()枚举器上的方法,它将读取文件中的所有行以便对其进行计数,因此当您稍后尝试再次使用枚举时,它已经读取了所有行并关闭了 TextReader .

使用 File.ReadAllLines读取文件中所有行的方法,而不是获取枚举器:

string[] URLs = File.ReadAllLines(Path.GetFullPath(@"Resources\FeedList.txt"));

现在您可以多次使用该数组。

关于c# - Parallel.ForEach 和无法从关闭的 TextReader 异常中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7951420/

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