C# 索引超出范围,多线程,日志
C# index out of range, multi thread, Logs
我正在尝试从 windows 获取日志。为了让它更快,我寻找日志所在的日子,然后在那些日子的范围内,我每天打开一个线程以快速加载它。在函数 work1
中出现错误 "Index was outside the bounds of the array"。如果我只在一个线程中完成这项工作,它可以正常工作,但速度非常非常慢。
我尝试使用来自
“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");
}
}
将var tt2 = test;
替换为var tt2 = test.ToArray();
该错误是您在代码中多次犯的错误:您无数次枚举数据。调用 .Count()
再次枚举数据,在这种情况下,数据最终会与 EventLogEntry
枚举器中的缓存值发生冲突。
LINQ 没有 return 数据集。它 return 是一个查询。每次调用 Count()
、First()
或 Last()
时,类型 IEnumerable<T>
的变量可能 return 不同的值。调用 .ToArray()
使 C# 检索结果并将其存储在数组中。
您通常应该只枚举一个 IEnumerable<T>
一次。
我正在尝试从 windows 获取日志。为了让它更快,我寻找日志所在的日子,然后在那些日子的范围内,我每天打开一个线程以快速加载它。在函数 work1
中出现错误 "Index was outside the bounds of the array"。如果我只在一个线程中完成这项工作,它可以正常工作,但速度非常非常慢。
我尝试使用来自 “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");
}
}
将var tt2 = test;
替换为var tt2 = test.ToArray();
该错误是您在代码中多次犯的错误:您无数次枚举数据。调用 .Count()
再次枚举数据,在这种情况下,数据最终会与 EventLogEntry
枚举器中的缓存值发生冲突。
LINQ 没有 return 数据集。它 return 是一个查询。每次调用 Count()
、First()
或 Last()
时,类型 IEnumerable<T>
的变量可能 return 不同的值。调用 .ToArray()
使 C# 检索结果并将其存储在数组中。
您通常应该只枚举一个 IEnumerable<T>
一次。