首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >超出范围的C#索引、多线程、日志

超出范围的C#索引、多线程、日志
EN

Stack Overflow用户
提问于 2015-02-18 09:43:25
回答 1查看 826关注 0票数 1

我想从窗户上拿些木头。为了使它更快,我寻找日志所在的日子,然后在那些日子里,我每天打开一个线程来快速加载它。在函数work1中,会出现“索引超出数组界限”的错误。如果我只在一个线程中完成这个任务,它可以正常工作,但是它非常慢。

我试图使用"Index was outside the bounds of the array while trying to start multiple threads“中的信息,但它不起作用。

我认为问题是在IEnumerable中加载的,就像在循环启动时没有及时加载一样。

对不起我的英语,我来自乌兹别克斯坦。

代码语言:javascript
复制
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");
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28580303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档