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

upravlenie

Client
Joined
Dec 31, 2020
Messages
236
Reaction score
16
Points
18
Здравствуйте)

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

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

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

upravlenie

Client
Joined
Dec 31, 2020
Messages
236
Reaction score
16
Points
18
поиск же на форуме работает. тема изжевана до состояния каши.
там в общих чертах написано для:
Для популярных типов внешних ресурсов в ZennoPoster предусмотрено три объекта синхронизации, которые в C#-коде указываются в круглых скобках после lock:
SyncObjects.ListSyncer - для списков
SyncObjects.TableSyncer - для таблиц
SyncObjects.InputSyncer - для буфера обмена


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

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

Mikhail B.

Client
Joined
Dec 23, 2014
Messages
14,453
Reaction score
5,473
Points
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

upravlenie

Client
Joined
Dec 31, 2020
Messages
236
Reaction score
16
Points
18
Все же буду признателен знающему человеку за код c#
 

Mikhail B.

Client
Joined
Dec 23, 2014
Messages
14,453
Reaction score
5,473
Points
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

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;  
}
 

Attachments

  • Thank you
Reactions: Phoenix78

Nelirr

Пользователь
Joined
Mar 23, 2021
Messages
87
Reaction score
7
Points
8
Здравствуйте)

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

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

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

upravlenie

Client
Joined
Dec 31, 2020
Messages
236
Reaction score
16
Points
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
// удалить строку
//записать новую строку в файл
}
 
  • Thank you
Reactions: Mikhail B.

Mikhail B.

Client
Joined
Dec 23, 2014
Messages
14,453
Reaction score
5,473
Points
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

Как видите теория и практика вещи разные)) Какая конечная цель данных действий? Может быть другое решение поищем.
 

Phoenix78

Client
Read only
Joined
Nov 6, 2018
Messages
11,789
Reaction score
5,729
Points
113
странно... нормальный код.
ну вопросы от незнания механизмов работы зеннопостера. а так код рабочий, ни один поток при таком подходе не сможет взять одну и туже строку одновременно.
 

upravlenie

Client
Joined
Dec 31, 2020
Messages
236
Reaction score
16
Points
18
Я сохраняю в файл счетчик, который в последствии присваивает уникальный номер файлам
 

alex8020

Client
Joined
Aug 16, 2016
Messages
38
Reaction score
39
Points
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
}
 

upravlenie

Client
Joined
Dec 31, 2020
Messages
236
Reaction score
16
Points
18
странно... нормальный код.
ну вопросы от незнания механизмов работы зеннопостера. а так код рабочий, ни один поток при таком подходе не сможет взять одну и туже строку одновременно.
Вы правы) незнание еще присутствует) не все начали использовать зеннопостер в 2018 году) кто-то приобрел его в 2021 и пытается разобраться)
 

Mikhail B.

Client
Joined
Dec 23, 2014
Messages
14,453
Reaction score
5,473
Points
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

Я сохраняю в файл счетчик, который в последствии присваивает уникальный номер файлам
Типо надо по порядку? Почему бы не генерить просто?
 

upravlenie

Client
Joined
Dec 31, 2020
Messages
236
Reaction score
16
Points
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
}
Премного благодарен, это то, что нужно!
 

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)