Обновить файл(список)

fargot31

Client
Регистрация
26.09.2017
Сообщения
65
Благодарностей
13
Баллы
8
Подскажите,есть шаб,работает в многопотоке,каждый поток берет строки из списка,и в процесе выполнения по логике может добавить строки обратно,но следующий поток когда считает к-во строк,не видит ети строки, уже сам смотрю что в файле(списке) остаеться несколько сотен строк,пересохраняю файл в нотпаде в ручную.
Можно как то обновлять список при достижении n-ого количества строк?
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 339
Благодарностей
5 433
Баллы
113
т.е. вы записываете строку в список, но ее не видят потоки?
 

fargot31

Client
Регистрация
26.09.2017
Сообщения
65
Благодарностей
13
Баллы
8
Каждый поток считает строки и выводит в лог,если предыдущий поток взял 20 строк и добавил обратно,то следущий поток етих 20 строк не подсчытывает,получаеться не видит,по истечению строк по подсчетам зенки,потоки начинают некоректно добавлять строки и в файле каша,в файле есть например 5к строк,а поток выдает 0.
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 339
Благодарностей
5 433
Баллы
113
Каждый поток считает строки и выводит в лог,если предыдущий поток взял 20 строк и добавил обратно,то следущий поток етих 20 строк не подсчытывает,получаеться не видит,по истечению строк по подсчетам зенки,потоки начинают некоректно добавлять строки и в файле каша,в файле есть например 5к строк,а поток выдает 0.
Запись в список лочите?
 

fargot31

Client
Регистрация
26.09.2017
Сообщения
65
Благодарностей
13
Баллы
8

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 339
Благодарностей
5 433
Баллы
113
Да,все работы со списком в lock-ах
Условно говоря, было 100 строк, 20 взяли, через минуту добавили 20 обратно и через секунду новый поток проверяет список и видит не 100 строк как должно быть, а 80. Верно?

Пробовали в локе паузу ставить после записи? Например 5 сек для проверки.
 

fargot31

Client
Регистрация
26.09.2017
Сообщения
65
Благодарностей
13
Баллы
8
Условно говоря, было 100 строк, 20 взяли, через минуту добавили 20 обратно и через секунду новый поток проверяет список и видит не 100 строк как должно быть, а 80. Верно?

Пробовали в локе паузу ставить после записи? Например 5 сек для проверки.
Да,все верно.Паузу не ставил,сейчас поставлю и посмотрю.
 
  • Спасибо
Реакции: Mikhail B.

fargot31

Client
Регистрация
26.09.2017
Сообщения
65
Благодарностей
13
Баллы
8
Пауза не помогла,вот поток подсчытал строки как 12 строк,на самом деле там 61 строка была https://prnt.sc/tk59jt
Следующий поток уже не смог взять строки,он должен был взять больше 12 строк,в итоге все строки из файла удалились https://prnt.sc/tk5akc
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 339
Благодарностей
5 433
Баллы
113
Файл как привязан? Покажите настройки.
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 390
Благодарностей
3 310
Баллы
113
  • Спасибо
Реакции: Mikhail B.

fargot31

Client
Регистрация
26.09.2017
Сообщения
65
Благодарностей
13
Баллы
8
Файл как привязан? Покажите настройки.
Если имееться ввиду,как список привязан к файлу,то вот настройки https://prnt.sc/tk5gk1

//Берем строки
lock(SyncObjects.ListSyncer) {
////Привязываем список к файлу
var baza = project.Lists["для отправки"];
baza.Bind(@"ПУТЬ К ФАЙЛУ");

var m = int.Parse(project.Variables["ПЕРЕМЕНАЯ"].Value);
var str = project.Lists["для отправки"];
var count = m; // сколько строк брать

var stra = string.Join(",+\r\n", str.Take(count));
project.Variables["ПЕРЕМЕНАЯ"].Value = stra;
for (int i = 1; i <=m; i++) {
str.RemoveAt(0);
}

project.Variables["strok_v_baze"].Value = baza.Count.ToString();
//return baza.Count();

System.Threading.Thread.Sleep(2300);
}



//Добавление строк в случае ошибки
lock (CommonCode.BAZA){

IZennoList list = project.Lists["для отправки"];
///Добавляем строку
list.Add(project.Variables["ПЕРЕМЕНАЯ"].Value);
list.Add(project.Variables["ПЕРЕМЕНАЯ1"].Value);

//System.Threading.Thread.Sleep(5000);
}
 
Последнее редактирование:
  • Спасибо
Реакции: Mikhail B.

doc

Client
Регистрация
30.03.2012
Сообщения
8 614
Благодарностей
4 604
Баллы
113
Если имееться ввиду,как список привязан к файлу,то вот настройки https://prnt.sc/tk5gk1

//Берем строки
lock(SyncObjects.ListSyncer) {
////Привязываем список к файлу
var baza = project.Lists["для отправки"];
baza.Bind(@"ПУТЬ К ФАЙЛУ");

var m = int.Parse(project.Variables["ПЕРЕМЕНАЯ"].Value);
var str = project.Lists["для отправки"];
var count = m; // сколько строк брать

var stra = string.Join(",+\r\n", str.Take(count));
project.Variables["ПЕРЕМЕНАЯ"].Value = stra;
for (int i = 1; i <=m; i++) {
str.RemoveAt(0);
}

project.Variables["strok_v_baze"].Value = baza.Count.ToString();
//return baza.Count();

System.Threading.Thread.Sleep(2300);
}



//Добавление строк в случае ошибки
lock (CommonCode.BAZA){

IZennoList list = project.Lists["для отправки"];
///Добавляем строку
list.Add(project.Variables["ПЕРЕМЕНАЯ"].Value);
list.Add(project.Variables["ПЕРЕМЕНАЯ1"].Value);

//System.Threading.Thread.Sleep(5000);
}
где лок при взятии и удалении? Зачем один и тот же список прокидывать в несколько переменных?
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 339
Благодарностей
5 433
Баллы
113
Вот такие коды использую, проблем не было.

Запись
C#:
var List1 = project.Lists["БАЗА ОТВЕТОВ"];
var url2 = "ID:" + project.Variables["message_id"].Value + "|" + "Login_Pass:" + project.Variables["Telegram_Login_Pass"].Value + "|" + "Proxy:" + project.Variables["Telegram_proxy"].Value + "|" + "URL_DIALOG:" + project.Variables["URL_dialog_Telegram"].Value + "|" + "Message:" + project.Variables["INPUT_MESSAGE"].Value + "|END";
lock(SyncObjects.ListSyncer)
{
    if (url2 != "")
    {
    List1.Add(url2);
        return "Ok";
    }
}
Чтение с удалением. Правда тут обращение к списку немного другое, брал с разных проектов коды.
C#:
IZennoList GeneralList = project.Lists["GENERAL-LIST"]; //Получаем указатель на лист с проксями

int count = 2;
for (int i = 0; i < count; i++)
{
    string url = string.Empty;
  
    lock (SyncObjects.ListSyncer)
    {
        if (GeneralList.Count > 0)
        {
            url = GeneralList[0];
            GeneralList.RemoveAt(0);
            return url;
        }
    }
    System.Threading.Thread.Sleep(1 * 500);
}
throw new Exception("");
 
Последнее редактирование:
  • Спасибо
Реакции: luk911

fargot31

Client
Регистрация
26.09.2017
Сообщения
65
Благодарностей
13
Баллы
8
где лок при взятии и удалении? Зачем один и тот же список прокидывать в несколько переменных?
Я думал лок на все идет,в начале
//Берем строки
lock(SyncObjects.ListSyncer)

Ето в разых кодах стоит,взятие в начале проекта,и добавление в конце если нужно
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 614
Благодарностей
4 604
Баллы
113
Я думал лок на все идет,в начале
//Берем строки
lock(SyncObjects.ListSyncer)

Ето в разых кодах стоит,взятие в начале проекта,и добавление в конце если нужно
да, просмотрел я. Только это ничего не меняет. Локи разные и друг друга не перекрывают
 
  • Спасибо
Реакции: Mikhail B.

fargot31

Client
Регистрация
26.09.2017
Сообщения
65
Благодарностей
13
Баллы
8

fargot31

Client
Регистрация
26.09.2017
Сообщения
65
Благодарностей
13
Баллы
8
Не обновляеться все равно,в файле есть строки,последний поток насчытал 5 а их намного больше,выходит по ошибке и файл полностью очищает https://prnt.sc/tk7tzn
Как его обновить фиг знает,перед доблением и взятием привязываю файл к списку.
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 339
Благодарностей
5 433
Баллы
113
Не обновляеться все равно,в файле есть строки,последний поток насчытал 5 а их намного больше,выходит по ошибке и файл полностью очищает https://prnt.sc/tk7tzn
Как его обновить фиг знает,перед доблением и взятием привязываю файл к списку.
Пример шаблона скиньте @Zymlex
 

fargot31

Client
Регистрация
26.09.2017
Сообщения
65
Благодарностей
13
Баллы
8

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