c# - 在多个线程中添加和删除时 List<string> 中的 null 值

标签 c# multithreading list

我知道 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");
    }
});

这是几秒钟后列表的一部分:

enter image description here

如果条目不存在于列表中,则负责从列表中删除条目的线程可能会崩溃。因此,出于其他多线程原因,我理解为什么没有从列表中删除某些对象,但我不明白这些空值是如何生成的。有没有人解释这些值是如何生成的?

最佳答案

List<T>除了 N 次读取和零次写入之外,不是线程安全的;任何非零写入次数 与其他任何东西一起不受支持,并且这种行为是完全未定义的。如果您需要并发:要么添加同步,要么使用并发集合类型。

关于c# - 在多个线程中添加和删除时 List<string> 中的 null 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60396932/

相关文章:

c# - 没有 SQL Server 的 Visual Studio 2012 安装

c# - 在Gridview中上传文件,完成后在同一行显示

C# Bitwise OR 需要用字节进行转换*有时*

c# - 从 GridView 添加项目到 ListBox

arrays - 什么是最好的 VBA 数据类型`key`= >`value` 来保存与 PHP 数组相同的数据

java - 在 Java 中为 2D 太空射击游戏创建游戏循环

java - 如何在移动 Sprite 时重新绘制小程序?

java - servlets容器如何实例化servlets使用的外部类?

python - 从列表列表中删除子列表

python - 获取两个列表之间的交集