У меня есть событие, которое добавляет в список типа List данные. И во всём остальном коде я использую этот список. Получаю, конечно же, эксепшены, если использую список в момент его пополнения. Как можно реализовать момент, чтобы все места, где я List пополняю, ожидали, если он где-то в данный момент используется?
Только начинаю сталкиваться с многопоточностью, поэтому вопрос может быть глупый.
Пример, функции выполняются в разных потоках
public void eventValue(int value)
{
list.Add(value)
}
public void nameFunt()
{
...
list.Select(.....);
...
}
Получаю эксепшн, если использую Select и в этот же момент вызывается другая функция, которая добавляет элемент.
Ты можешь установить блокировку.
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. Подробнее тут.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей