Цикл поиска по таблице значения из списка — как правильно лочить?

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
404
Баллы
63
Добрый день!
Есть необходимость поиска по таблице значений из списка. Как правильно залочить объекты для многопотока?
C#:
//таблица
var table = project.Tables["table"];
//исключения
var excep = project.Lists["exception"];

//лочим список
lock(SyncObjects.ListSyncer)
{
    //в цикле обходим список
    for (int i=0; i<excep.Count; i++)
    {
        //берем строку из списка
        string expt = excep.GetItem(i.ToString(), false);
        //удаляем лишнее - https://vk.com/id
        string search = Macros.TextProcessing.Replace(expt,"replace_value", "", "Text", "First")
        
        //в цикле ищем полученную строку по ячейкам таблицы
        for(int j=0; j<table.RowCount; j++)
        {
            //берем ячейку 0
            string cell = table.GetCell("0",j);           
            
            //ищем вхождение
            if (search == cell)
            {
                return "Нашёл!";
            }
        }
    }
}
Правильно ли я понимаю, что внутрь lock(SyncObjects.ListSyncer), после входа одного потока другие не попадут до его выхода, и следовательно отдельно лочить еще и таблицу уже не нужно?
 

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Добрый день!
Есть необходимость поиска по таблице значений из списка. Как правильно залочить объекты для многопотока?
C#:
//таблица
var table = project.Tables["table"];
//исключения
var excep = project.Lists["exception"];

//лочим список
lock(SyncObjects.ListSyncer)
{
    //в цикле обходим список
    for (int i=0; i<excep.Count; i++)
    {
        //берем строку из списка
        string expt = excep.GetItem(i.ToString(), false);
        //удаляем лишнее - https://vk.com/id
        string search = Macros.TextProcessing.Replace(expt,"replace_value", "", "Text", "First")
      
        //в цикле ищем полученную строку по ячейкам таблицы
        for(int j=0; j<table.RowCount; j++)
        {
            //берем ячейку 0
            string cell = table.GetCell("0",j);         
          
            //ищем вхождение
            if (search == cell)
            {
                return "Нашёл!";
            }
        }
    }
}
Правильно ли я понимаю, что внутрь lock(SyncObjects.ListSyncer), после входа одного потока другие не попадут до его выхода, и следовательно отдельно лочить еще и таблицу уже не нужно?
Все правильно сделал.
 
  • Спасибо
Реакции: semafor

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Добрый день!
Есть необходимость поиска по таблице значений из списка. Как правильно залочить объекты для многопотока?
C#:
//таблица
var table = project.Tables["table"];
//исключения
var excep = project.Lists["exception"];

//лочим список
lock(SyncObjects.ListSyncer)
{
    //в цикле обходим список
    for (int i=0; i<excep.Count; i++)
    {
        //берем строку из списка
        string expt = excep.GetItem(i.ToString(), false);
        //удаляем лишнее - https://vk.com/id
        string search = Macros.TextProcessing.Replace(expt,"replace_value", "", "Text", "First")
      
        //в цикле ищем полученную строку по ячейкам таблицы
        for(int j=0; j<table.RowCount; j++)
        {
            //берем ячейку 0
            string cell = table.GetCell("0",j);         
          
            //ищем вхождение
            if (search == cell)
            {
                return "Нашёл!";
            }
        }
    }
}
Правильно ли я понимаю, что внутрь lock(SyncObjects.ListSyncer), после входа одного потока другие не попадут до его выхода, и следовательно отдельно лочить еще и таблицу уже не нужно?
Если будут баги - просто оберни этот цикл в лок в ещё один - .TableSyncer ) Я этот момент пропустил, а так все норм должно быть
 

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
  • Спасибо
Реакции: semafor

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