У меня есть событие, которое добавляет в список типа 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
. Подробнее тут.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
В обычном C# проекте я просто скопировал этотdll в папку проекта и использовал
Сегодня поменяли ПК на более мощныйУстановили такую же версию Visual Studio (2015 Enterprise)