C# залочить текстовый файл

upravlenie

Client
Регистрация
31.12.2020
Сообщения
232
Благодарностей
16
Баллы
18
Здравствуйте)

-Беру текстовый файл, в котором цифра со счетчиком.
-Кладу в переменную и добавляю 1.
-Записываю результат в этот же файл.

Реализовал на кубиках.

Помогите плиз с кодом C#. Нужно залочить весь этот процесс для многопотока.
Заранее признателен)
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

upravlenie

Client
Регистрация
31.12.2020
Сообщения
232
Благодарностей
16
Баллы
18
поиск же на форуме работает. тема изжевана до состояния каши.
там в общих чертах написано для:
Для популярных типов внешних ресурсов в ZennoPoster предусмотрено три объекта синхронизации, которые в C#-коде указываются в круглых скобках после lock:
SyncObjects.ListSyncer - для списков
SyncObjects.TableSyncer - для таблиц
SyncObjects.InputSyncer - для буфера обмена


для текстового файла примера нет.

Прибавлять единицу могу только в ява скрипт, в c# не умею.
Поэтому и попросил помощи.
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113

upravlenie

Client
Регистрация
31.12.2020
Сообщения
232
Благодарностей
16
Баллы
18
Все же буду признателен знающему человеку за код c#
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
C#:
var List = project.Lists["List"];
var num ="";
lock(SyncObjects.ListSyncer)
{
//float a = int.Parse(project.Variables["a"].Value);
  num = List[0]; // взять строку
  List.RemoveAt(0); //удалить строку
  int  a = int.Parse(num);
  var result = (a + 1).ToString(); // прибавляем 1
  List.Add(result); //запись
  return result;  
}
 

Вложения

  • Спасибо
Реакции: Phoenix78

Nelirr

Пользователь
Регистрация
23.03.2021
Сообщения
87
Благодарностей
7
Баллы
8
Здравствуйте)

-Беру текстовый файл, в котором цифра со счетчиком.
-Кладу в переменную и добавляю 1.
-Записываю результат в этот же файл.

Реализовал на кубиках.

Помогите плиз с кодом C#. Нужно залочить весь этот процесс для многопотока.
Заранее признателен)
Привет. Обычно так делают:
C#:
//тут объявление списка
lock(SyncObjects.ListSyncer){
    //взятие строки из списка тут и возврат, если нужно
}
 

upravlenie

Client
Регистрация
31.12.2020
Сообщения
232
Благодарностей
16
Баллы
18
C#:
var List = project.Lists["List"];
var num ="";
lock(SyncObjects.ListSyncer)
{
//float a = int.Parse(project.Variables["a"].Value);
  num = List[0]; // взять строку
  List.RemoveAt(0); //удалить строку
  int  a = int.Parse(num);
  var result = (a + 1).ToString(); // прибавляем 1
  List.Add(result); //запись
  return result; 
}
Спасибо за код, но он не лочит текстовый файл, и не сохраняет изменение списка в файл, во время лока.
Таким образом другой поток может взять эту же цифру из файла и нумерация продублируется.

Мне нужно что то типа:

C#:
var List = project.Lists["List"];
var num ="";
lock(SyncObjects.ListSyncer)
{

 // взять строку из файла
 // прибавляем 1
// удалить строку
//записать новую строку в файл
}
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
Как видите теория и практика вещи разные)) Какая конечная цель данных действий? Может быть другое решение поищем.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
странно... нормальный код.
ну вопросы от незнания механизмов работы зеннопостера. а так код рабочий, ни один поток при таком подходе не сможет взять одну и туже строку одновременно.
 

upravlenie

Client
Регистрация
31.12.2020
Сообщения
232
Благодарностей
16
Баллы
18
Я сохраняю в файл счетчик, который в последствии присваивает уникальный номер файлам
 

alex8020

Client
Регистрация
16.08.2016
Сообщения
38
Благодарностей
39
Баллы
18
C#:
lock(SyncObjects.ListSyncer)
{
    string s = File.ReadAllText(project.Directory + @"\list.txt").Trim(); // взять счетчик из файла list.txt (должна быть одна строка в файле)
    project.Variables["counter"].Value = s; // добавить его в переменную counter
    int i = int.Parse(s) + 1; // добавить к счетчику единицу
    File.WriteAllText(project.Directory + @"\list.txt", i.ToString()); // перезаписать файл list.txt
}
 
  • Спасибо
Реакции: qweeeraz и upravlenie

upravlenie

Client
Регистрация
31.12.2020
Сообщения
232
Благодарностей
16
Баллы
18
странно... нормальный код.
ну вопросы от незнания механизмов работы зеннопостера. а так код рабочий, ни один поток при таком подходе не сможет взять одну и туже строку одновременно.
Вы правы) незнание еще присутствует) не все начали использовать зеннопостер в 2018 году) кто-то приобрел его в 2021 и пытается разобраться)
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113

upravlenie

Client
Регистрация
31.12.2020
Сообщения
232
Благодарностей
16
Баллы
18
C#:
lock(SyncObjects.ListSyncer)
{
    string s = File.ReadAllText(project.Directory + @"\list.txt").Trim(); // взять счетчик из файла list.txt (должна быть одна строка в файле)
    project.Variables["counter"].Value = s; // добавить его в переменную counter
    int i = int.Parse(s) + 1; // добавить к счетчику единицу
    File.WriteAllText(project.Directory + @"\list.txt", i.ToString()); // перезаписать файл list.txt
}
Премного благодарен, это то, что нужно!
 

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