Вопрос по lock методу в ZennoPoster C#

Veterinar

Client
Регистрация
01.07.2016
Сообщения
194
Благодарностей
22
Баллы
18
Доброго времени суток.

Такая штука, есть список по которому проходят проверки список очень большой от 100к строк и продолжает расти.

Стандартный `List.Contains`метод дает само собой плохой результат так как стандартный список не рассчитан на такое количество данных по этому стал использовать HashSet (если кому интересно то можете почитать про производительность HashSet и List на StackOwerflow был даже вопрос где кто то привел подробный тест производительности и того и другого вида ссылку не помню но если погуглите найдете)

Сам код проверки наличия элемента в списке довольно стандартный работает как надо:
Код:
HashSet<string> set = new HashSet<string>(File.ReadLines("c:/set.txt"));
string str = "Какая то переменная из зенки или от куда угодно";
if(set.Contains(str))
{
// Делаем что то
}
else
{
// Делаем то то
}
Вот собственно в чем проблема в добавлении элемента. Работаю в многопотоке, и когда записываю строку в тот самый заветный файл иногда инстансы пытаются сделать это одновременно и соответственно возникает ошибка так как только один процесс может взаимодействовать с файлом в таком ключе.

Читал о lock методе в Zenno но не смог разобраться как прикрутить его к этому скрипту если кто делал подобное можете помочь пожалуйста.

Вот сама запись в файл(список (HashSet)):
Код:
File.AppendAllText(@""c:/set.txt"", "text content" + Environment.NewLine)
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 498
Благодарностей
3 364
Баллы
113
Требуется как для записи, так и для чтения:
C#:
lock (SyncObjects.ListSyncer){
    File.AppendAllText(@"c:/set.txt", "text content" + Environment.NewLine)
}
Но вообще, советую перейти на БД.

Для тех кто выбирает коллекцию, есть: Выбор коллекции
 
Последнее редактирование:
  • Спасибо
Реакции: Veterinar и Adigen

Veterinar

Client
Регистрация
01.07.2016
Сообщения
194
Благодарностей
22
Баллы
18
Требуется как для записи, так и для чтения:
C#:
lock (SyncObjects.ListSyncer){
    File.AppendAllText(@"c:/set.txt", "text content" + Environment.NewLine)
}
Но вообще, советую перейти на БД.

Для тех кто выбирает коллекцию, есть: Выбор коллекции
Спасибо за помощь

БД к сожалению не вариант, там проще его периодически счищать просто как за 500к переваливает до 100к, под это сделал небольшой скрипт.

Да и ума пока не хватает, с БД никогда не работал=)
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 432
Баллы
113
C#:
lock (SyncObjects.ListSyncer){
    File.AppendAllText(@"c:/set.txt", "text content" + Environment.NewLine)
}
А что разве работа с txt файлами тоже локается через SyncObjects.ListSyncer? Можно ли так делать при работе со счетчиком в многопотоке?
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 498
Благодарностей
3 364
Баллы
113
А что разве работа с txt файлами тоже локается
Если с ним работают несколько потоков - необходимо.
через SyncObjects.ListSyncer?
Через любой статический объект (или константу).
Можно ли так делать при работе со счетчиком в многопотоке?
Да.
 
  • Спасибо
Реакции: SHILY и Astraport

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)