我知道 C# System.Collections.Generic.List 对象不是线程安全的。但我想知道为什么这段代码会生成空值。
Task.Run(() =>
{
for (var i = 0; i < 10; i++)
{
var str = $"Test {i}";
list.Add(str);
if (i == 9)
{
i = 0;
}
}
});
Task.Run(() =>
{
while (true)
{
list.Remove("Test 1");
list.Remove("Test 2");
list.Remove("Test 3");
list.Remove("Test 4");
list.Remove("Test 5");
list.Remove("Test 6");
list.Remove("Test 7");
list.Remove("Test 8");
list.Remove("Test 9");
}
});
这是几秒钟后列表的一部分:
如果条目不存在于列表中,则负责从列表中删除条目的线程可能会崩溃。因此,出于其他多线程原因,我理解为什么没有从列表中删除某些对象,但我不明白这些空值是如何生成的。有没有人解释这些值是如何生成的?
最佳答案
List<T>
除了 N 次读取和零次写入之外,不是线程安全的;任何非零写入次数 与其他任何东西一起不受支持,并且这种行为是完全未定义的。如果您需要并发:要么添加同步,要么使用并发集合类型。
关于c# - 在多个线程中添加和删除时 List<string> 中的 null 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60396932/