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

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
400
Баллы
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

Активный пользователь
Регистрация
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

Активный пользователь
Регистрация
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)