当运行下面的代码时,随机NREs的原因是什么?既然results是初始化的,那么如何才能将t作为null在lambda中获得呢?
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!
}发布于 2015-04-07 09:25:36
List<>不是线程安全的。您正在从多个线程中添加元素。如果你真的想使用它:
lock (results)
{
results.Add(Result.Create(...));
}注意你的例子是错误的..。编译和运行的内容将是:
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!或者更好
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<>编写:-),否则代码就没用了,并且将按顺序执行。
https://stackoverflow.com/questions/29488096
复制相似问题