Поставить лок на строку из таблицы до окончания работы инстанса

Passw0rd!

Client
Регистрация
02.10.2022
Сообщения
10
Благодарностей
0
Баллы
1
Всех приветствую, уважаемое комьюнити помогите разобраться несведущему в делах насущных.

С txt вношу нужную инфу в таблицу, беру с таблички с удалением - лог; пас; прокси и раскидываю по переменным, после с переменных в конец файла записываю новую строку, весь цикл работает - все хорошо. Но бывает такое что в многопотоке 2 инстанса успевают зайти в один и тот же профиль (где то видел что можно ставить ЛОК на время работы инстанса) вот подскажите решение, нужно ставить ЛОК ? если "Да" то как это сделать? или может отложенный запуск для каждого следующего инстанса, какие могут быть варианты?
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 767
Благодарностей
2 414
Баллы
113
Всех приветствую, уважаемое комьюнити помогите разобраться несведущему в делах насущных.

С txt вношу нужную инфу в таблицу, беру с таблички с удалением - лог; пас; прокси и раскидываю по переменным, после с переменных в конец файла записываю новую строку, весь цикл работает - все хорошо. Но бывает такое что в многопотоке 2 инстанса успевают зайти в один и тот же профиль (где то видел что можно ставить ЛОК на время работы инстанса) вот подскажите решение, нужно ставить ЛОК ? если "Да" то как это сделать? или может отложенный запуск для каждого следующего инстанса, какие могут быть варианты?
Да все предельно просто - используем что-то вроде этого (ниже) для чтения строки с таблицы и возврата строки в таблицу - и проблем при работе с таблицей в многопотоке быть не должно. Чтобы два потока не брали одни и те же данные - добавлять их в конец таблицы нужно либо по Good-end либо по Bad-end чтобы на момент запуска других потоков не было данных в таблице, если ещё работает с ними другой поток.

Взять первую строку с таблички tb с удалением, результат первых две ячейки в переменные cell_0 и cell_1:
C#:
string[] data = new string[0];
var tb = project.Tables["tb"];
lock(SyncObjects.TableSyncer){
    if(tb.RowCount > 0) {
        data = tb.GetRow("0", true).ToArray(); // Взяли с удалением
    }
}

project.Variables["cell_0"].Value = data.Length > 0 ? data[0] : string.Empty;
project.Variables["cell_1"].Value = data.Length > 1 ? data[1] : string.Empty;
Вернуть данные обратно в конец таблицы tb с переменных cell_0 и cell_1 предварительно заблокировав таблицу:
C#:
string[] data = new []{
    project.Variables["cell_0"].Value,
    project.Variables["cell_1"].Value
};
var tb = project.Tables["tb"];
lock(SyncObjects.TableSyncer){
    tb.AddRow(data);
}
 
  • Спасибо
Реакции: Passw0rd!

Passw0rd!

Client
Регистрация
02.10.2022
Сообщения
10
Благодарностей
0
Баллы
1
Да все предельно просто - используем что-то вроде этого (ниже) для чтения строки с таблицы и возврата строки в таблицу - и проблем при работе с таблицей в многопотоке быть не должно. Чтобы два потока не брали одни и те же данные - добавлять их в конец таблицы нужно либо по Good-end либо по Bad-end чтобы на момент запуска других потоков не было данных в таблице, если ещё работает с ними другой поток.

Взять первую строку с таблички tb с удалением, результат первых две ячейки в переменные cell_0 и cell_1:
C#:
string[] data = new string[0];
var tb = project.Tables["tb"];
lock(SyncObjects.TableSyncer){
    if(tb.RowCount > 0) {
        data = tb.GetRow("0", true).ToArray(); // Взяли с удалением
    }
}

project.Variables["cell_0"].Value = data.Length > 0 ? data[0] : string.Empty;
project.Variables["cell_1"].Value = data.Length > 1 ? data[1] : string.Empty;
Вернуть данные обратно в конец таблицы tb с переменных cell_0 и cell_1 предварительно заблокировав таблицу:
C#:
string[] data = new []{
    project.Variables["cell_0"].Value,
    project.Variables["cell_1"].Value
};
var tb = project.Tables["tb"];
lock(SyncObjects.TableSyncer){
    tb.AddRow(data);
}
Да, спасибо, я с c# не очень знаком, если оставить так как у вас то вот что выдает:
Компиляция кода Ошибка в действии "CS1501" "No overload for method 'GetRow' takes 2 arguments". [Строка: 5; Cтолбец: 19]
Из поиска в гугле по запросу - Компиляция кода Ошибка в действии "CS1501" мною было понятно ровном счетом ничего
На интуитивном уровне догадываюсь что где то нужно что то подставить.

Вот так выглядит у меня:

C#:
string[] data = new string[0];
var tb = project.Tables["List0"];
lock(SyncObjects.TableSyncer){
    if(tb.RowCount > 0) {
        data = tb.GetRow("0", true).ToArray(); // Взяли с удалением
    }
}

project.Variables["login"].Value = data.Length > 0 ? data[0] : string.Empty;
project.Variables["pass"].Value = data.Length > 1 ? data[1] : string.Empty;
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 767
Благодарностей
2 414
Баллы
113
Да, спасибо, я с c# не очень знаком, если оставить так как у вас то вот что выдает:
Компиляция кода Ошибка в действии "CS1501" "No overload for method 'GetRow' takes 2 arguments". [Строка: 5; Cтолбец: 19]
Из поиска в гугле по запросу - Компиляция кода Ошибка в действии "CS1501" мною было понятно ровном счетом ничего
На интуитивном уровне догадываюсь без догадок, где то что нужно подставить.

Вот так выглядит у меня:

C#:
string[] data = new string[0];
var tb = project.Tables["List0"];
lock(SyncObjects.TableSyncer){
    if(tb.RowCount > 0) {
        data = tb.GetRow("0", true).ToArray(); // Взяли с удалением
    }
}

project.Variables["login"].Value = data.Length > 0 ? data[0] : string.Empty;
project.Variables["pass"].Value = data.Length > 1 ? data[1] : string.Empty;
Да, замените GetRow на GetItem, это мой косяк, набирал код "на коленке" без проджект мейкера.
 
  • Спасибо
Реакции: evgenii2000 и Passw0rd!

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