首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PLINQ + LINQ = NRE?

PLINQ + LINQ = NRE?
EN

Stack Overflow用户
提问于 2015-04-07 09:21:53
回答 1查看 86关注 0票数 0

当运行下面的代码时,随机NREs的原因是什么?既然results是初始化的,那么如何才能将t作为null在lambda中获得呢?

代码语言:javascript
复制
var results = new List<Result>();

for (int i = 0; i < 100; i++)
{
    Parallel.For((index) =>
        {
            results.Add(Result.Create(...));    
        });

    results = results.Where(t => t.IsValid).ToList(); // NRE here due to t is null!

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-07 09:25:36

List<>不是线程安全的。您正在从多个线程中添加元素。如果你真的想使用它:

代码语言:javascript
复制
lock (results)
{
    results.Add(Result.Create(...));
}

注意你的例子是错误的..。编译和运行的内容将是:

代码语言:javascript
复制
var results = new List<Result>();

Parallel.For(0, 100, index =>
{
    lock (results)
    {
        results.Add(Result.Create(...));
    }
});

results = results.Where(t => t.IsValid).ToList(); // NRE here due to t is null!

或者更好

代码语言:javascript
复制
var results = new List<Result>();

Parallel.For(0, 100, index =>
{
    var result = Result.Create(...);

    lock (results)
    {
        results.Add(result);
    }
});

results = results.Where(t => t.IsValid).ToList(); // NRE here due to t is null!

这样,result的创建就不会阻止List<>编写:-),否则代码就没用了,并且将按顺序执行。

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

https://stackoverflow.com/questions/29488096

复制
相关文章

相似问题

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