我想从窗户上拿些木头。为了使它更快,我寻找日志所在的日子,然后在那些日子里,我每天打开一个线程来快速加载它。在函数work1中,会出现“索引超出数组界限”的错误。如果我只在一个线程中完成这个任务,它可以正常工作,但是它非常慢。
我试图使用"Index was outside the bounds of the array while trying to start multiple threads“中的信息,但它不起作用。
我认为问题是在IEnumerable中加载的,就像在循环启动时没有及时加载一样。
对不起我的英语,我来自乌兹别克斯坦。
var result = from EventLogEntry elog in aLog.Entries
orderby elog.TimeGenerated
select elog.TimeGenerated;
DateTime OLDentry = result.First();
DateTime NEWentry = result.Last();
DTN.Add(result.First());
foreach (var dtn in result) {
if (dtn.Year != DTN.Last().Year |
dtn.Month != DTN.Last().Month |
dtn.Day != DTN.Last().Day
) {
DTN.Add(dtn);
}
}
List<Thread> t = new List<Thread>();
int i = 0;
foreach (DateTime day in DTN) {
DateTime yad = day;
var test = from EventLogEntry elog in aLog.Entries
where (elog.TimeGenerated.Year == day.Year) &&
(elog.TimeGenerated.Month == day.Month) &&
(elog.TimeGenerated.Day == day.Day)
select elog;
var tt2 = test.ToArray();
t.Add(new Thread(() => work1(tt2)));
t[i].Start();
i++;
}
static void work1(IEnumerable<EventLogEntry> b) {
var z = b;
for (int i = 0; i < z.Count(); i++) {
Console.Write(z + "\n");
}
}发布于 2015-02-18 10:03:27
将var tt2 = test;替换为var tt2 = test.ToArray();
错误是您在代码中多次执行的错误:您对数据进行了无数次的枚举。调用.Count()会再次枚举数据,在这种情况下,数据与EventLogEntry枚举器内的缓存值发生冲突。
LINQ不返回数据集。它返回一个查询。每次调用IEnumerable<T>、First()或Last()时,类型为First()的变量可能返回不同的值。调用.ToArray()使C#检索结果并将其存储在数组中。
通常应该只枚举一次IEnumerable<T>。
https://stackoverflow.com/questions/28580303
复制相似问题