[英]PLINQ + LINQ = NRE?
運行下面的代碼時,出現隨機NRE的原因是什么? 假設results
已初始化,那么如何在lambda中將t
設為null
?
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!
}
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<>
編寫:-)否則,該代碼將無用,它將按順序執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.