C#/。net / multithreading:在通用集合上调用成员函数

时间:2019-02-17 12:17:57

标签: c# generics collections

这总是正确吗?

让我们列出一个清单,并在其上调用一个功能函数,例如“查找”。在查找过程中,另一个线程将引用“列表”更新为新列表。这对“查找”结果或集合的任何其他成员功能有影响吗?

        List<string> list = new List<string>() { "a", "b", "c", "d" };

        string s = list.Find(e => {
            list = new List<string>() { "1", "2", "3", "4" }; // <- this line shall happen in another thread
            return e == "c";
        });

我不知道内部结构,但是是否可以确定引用(在这种情况下为“列表”)在Find开始执行之前仅被读取一次?

1 个答案:

答案 0 :(得分:1)

好吧,理论上,如果您对集合运行LINQ查询,它将使用列表GetEnumerator函数,该函数将返回知道如何枚举集合的枚举器对象,而不会使用包含对其引用的变量。

这就是为什么在此示例中:

        List<string> list = new List<string>() { "a", "b", "c", "d" };

        Task.Run(() =>
        {
            list.Find(e =>
            {
                Console.WriteLine($"El:{e}  Hashcode:{list.GetHashCode()}");
                Thread.Sleep(750);
                return e == "z";
            }).ToList();
        });

        Task.Run(() =>
        {
            Thread.Sleep(1000);
            list = new List<string>();
        });
        Console.ReadKey();

输出为:

El:a  Hashcode:63835064
El:b  Hashcode:63835064
El:c  Hashcode:11454272
El:d  Hashcode:11454272