Ожидание добавления данных, если они используются где-то

82
04 июля 2021, 23:30

У меня есть событие, которое добавляет в список типа List данные. И во всём остальном коде я использую этот список. Получаю, конечно же, эксепшены, если использую список в момент его пополнения. Как можно реализовать момент, чтобы все места, где я List пополняю, ожидали, если он где-то в данный момент используется? Только начинаю сталкиваться с многопоточностью, поэтому вопрос может быть глупый.

Пример, функции выполняются в разных потоках

public void eventValue(int value)
{
    list.Add(value)
}
public void nameFunt()
{
    ...
    list.Select(.....);
    ...
}

Получаю эксепшн, если использую Select и в этот же момент вызывается другая функция, которая добавляет элемент.

Answer 1

Ты можешь установить блокировку.

private object _lock = new object();    
public void eventValue(int value)
{
    lock(_lock)
        list.Add(value)
}
public void nameFunt()
{
    ...
    lock (_lock)
    {
        //Но т.к. LINQ имеет отложенное выполнение он ничего не вычисляет тут.
        //Следовательно lock не спасёт, т.к. нам нужно закончить итерацию внутри блокировки (нужно сказать LINQ, что нам нужен результат уже сейчас)
        //Для этого преобразует результат в нужную коллекцию сразу (в любую коллекцию ну или пол)
        list.Where(...).Select(.....).<любые обработки>.ToArray();
    }
    ...
}

Скорее всего необходимости именно в List нет, поэтому вы можете использовать также ConcurrentQueue. Подробнее тут.

READ ALSO
Как добавить .dll файл в Xamarin.Forms проект?

Как добавить .dll файл в Xamarin.Forms проект?

В обычном C# проекте я просто скопировал этотdll в папку проекта и использовал

100
При компиляции сбитая кодировка

При компиляции сбитая кодировка

Сегодня поменяли ПК на более мощныйУстановили такую же версию Visual Studio (2015 Enterprise)

107
Newtonsoft Json выдаёт пустую строку

Newtonsoft Json выдаёт пустую строку

От сервера получаю такой Json ответ:

91
Regex Split String

Regex Split String

Я не очень хорошо разбираюсь в регулярных выражениях, и мне требуется помощь

103