我正试图从Windows获取日志。为了使它更快,我寻找日志所在的日子,然后在那些日子里,我每天打开一个线程来快速加载它。在函数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");
}
}
答案 0 :(得分:1)
将var tt2 = test;
替换为var tt2 = test.ToArray();
错误是您在代码中多次执行的错误:您无数次地对数据进行枚举。调用.Count()
再次枚举数据,在这种情况下,数据最终与EventLogEntry
枚举器内的缓存值冲突。
LINQ不返回数据集。它返回一个查询。每次调用IEnumerable<T>
,Count()
或First()
时,Last()
类型的变量都可能返回不同的值。调用.ToArray()
使C#检索结果并将其存储在数组中。
您通常只需枚举IEnumerable<T>
一次。