簡體   English   中英

PLINQ + LINQ = NRE?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM