C#索引超出范围,多线程,日志

时间:2015-02-18 09:43:26

标签: c# multithreading logging indexing

我正试图从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");
    }
}

1 个答案:

答案 0 :(得分:1)

var tt2 = test;替换为var tt2 = test.ToArray();

错误是您在代码中多次执行的错误:您无数次地对数据进行枚举。调用.Count()再次枚举数据,在这种情况下,数据最终与EventLogEntry枚举器内的缓存值冲突。

LINQ不返回数据集。它返回一个查询。每次调用IEnumerable<T>Count()First()时,Last()类型的变量都可能返回不同的值。调用.ToArray()使C#检索结果并将其存储在数组中。

您通常只需枚举IEnumerable<T>一次。