meh*_*dvd 6 c# multithreading plinq task-parallel-library
当我正在研究框架的并行性时,我遇到了一个奇怪的情况,我无法想象为什么!我简化了情况来描述它很容易.考虑这段代码:
foreach(var person in personList)
{
if (person.Name == "Mehran")
break;
}
Run Code Online (Sandbox Code Playgroud)
其中personList在多个线程之间共享.
在什么情况下是有可能的person是null,我得到NullReferenceException的person.Name?
据我所知,这个人在这里被视为局部变量,如果我们进入foreach块,所以我们已personList成功迭代,所以person在任何情况下或任何并行场景都不应为null.
即使personList由另一个线程更改,或者引用person被处置,该person变量也应该具有值.因为没有人可以更改person引用的位置.
是否有任何情况可以解释这种情况?
Jon*_*eet 11
据我所知,这个人在这里被认为是一个局部变量,如果我们进入foreach块,所以我们已经成功迭代了personList,所以在任何情况下或任何并行场景中人都不应该为null.
仅仅因为你personList成功迭代并不意味着它不包含任何空值.例如:
List<Person> personList = new List<Person>();
personList.Add(null);
foreach (var person in personList)
{
// Here, person will be null
}
Run Code Online (Sandbox Code Playgroud)
(另外,如果有什么东西在修改列表,你通常会遇到麻烦 - 面对作者而言它们不是线程安全的 - 但我不认为这需要成为问题的一部分.)
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |