C # /. Net / многопоточность: вызов функций-членов в общих коллекциях - PullRequest
0 голосов
/ 17 февраля 2019

Всегда ли это правильно?

Давайте возьмем список и назовем функцию meberfunction, например «Найти».Пока выполняется поиск, другой поток обновляет ссылку «список» на новый список.Имеет ли это какое-либо влияние на результат «Найти» или любую другую функцию-член коллекции?

        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 голосов
/ 17 февраля 2019

Теоретически, если вы выполните запрос LINQ для коллекции, она будет использовать функцию Lists 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
...