Не проходит запись в файл через список

shtift

Client
Регистрация
29.07.2015
Сообщения
148
Благодарностей
290
Баллы
63
Привет! Проблема с записью.

1. Проверяю существует ли файл и создаю
Код:
var f = new FileInfo(path);
if (!Directory.Exists(f.DirectoryName))
    Directory.CreateDirectory(f.DirectoryName);
if (!File.Exists(path))
    File.CreateText(path);
2. Соединяю со списком
Код:
var list = project.Lists["list1"];
list.Bind(path);
В самом списке стоят все галочки - загружать, записывать, оставлять пустой

3. Добавляю строку в список
Код:
lock(SyncObjects.ListSyncer)
{
  list.Add("текст");
}
На данном этапе строка пишется в файл.

Проблема: если файла не существовало и он был создан в шаге 1, то в шаге 3 запись не удается и файл остается пустой. Если файл уже существует, то запись проходит успешно.
Как устранить?
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 544
Баллы
113
Попробуйте поставить паузу в несколько секунд после 1 шага.
 

shtift

Client
Регистрация
29.07.2015
Сообщения
148
Благодарностей
290
Баллы
63
Попробуйте поставить паузу в несколько секунд после 1 шага.
Да можно, но разве lock(SyncObjects.ListSyncer) не предназначена для этой проверки? Пока 1 поток блокирует доступ к файлу, другой должен подождать.
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 101
Баллы
113
но разве lock(SyncObjects.ListSyncer) не предназначена для этой проверки
Нет!
lock(SyncObjects.ListSyncer) - для работы с таблицей/списком (синхронизированными с файлом), во избежании ошибок, связанных с многопоточностью.
Ваша же проблема связана с тем, что синхронизация списка с файлом происходит не мгновенно, а через несколько секунд (время зависит от железа).
Так что, в вашем случае без паузы не обойтись. Или же построить шаблон вообще без привязки списка к файлу или привязывать только после всех действий над списком.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
Нет!
lock(SyncObjects.ListSyncer) - для работы с таблицей/списком (синхронизированными с файлом), во избежании ошибок, связанных с многопоточностью.
Ваша же проблема связана с тем, что синхронизация списка с файлом происходит не мгновенно, а через несколько секунд (время зависит от железа).
Так что, в вашем случае без паузы не обойтись. Или же построить шаблон вообще без привязки списка к файлу или привязывать только после всех действий над списком.
а при чём тут железо, я при паралельном запросе перепривязывал в 100 и более потоков и всё нормально
 

shtift

Client
Регистрация
29.07.2015
Сообщения
148
Благодарностей
290
Баллы
63
Нет!
lock(SyncObjects.ListSyncer) - для работы с таблицей/списком (синхронизированными с файлом), во избежании ошибок, связанных с многопоточностью.
Ваша же проблема связана с тем, что синхронизация списка с файлом происходит не мгновенно, а через несколько секунд (время зависит от железа).
Так что, в вашем случае без паузы не обойтись. Или же построить шаблон вообще без привязки списка к файлу или привязывать только после всех действий над списком.
Дело не во времени синхронизации списка с файлом, а в недоступности файла после создания. Т.к. если файл существует, список без проблем биндится и все удачно пишется.

Сделал проверку доступности файла с минимальными паузами
1. Создаем файл и пишем текст для проверки
Код:
var f = new FileInfo(path);
if (!Directory.Exists(f.DirectoryName))
    Directory.CreateDirectory(f.DirectoryName);
if (!File.Exists(path))
{
    project.SendInfoToLog("Создаем файл...", true);
    isCreate = true;
    System.IO.File.WriteAllText(path, "check");
}
2. В цикле коннектим список к файлу, ищем check. Если нашли, удаляем строку, завершаем цикл, можем спокойно писать в список
Код:
if (isCreate)
{   
    for (int i = 0; i < 10; i++)
    {
      System.Threading.Thread.Sleep(1000);
      try
      {
        var list = project.Lists["temp"];
        list.Bind(path);
        lock(SyncObjects.ListSyncer)
         {
           for(int j = 0; j < list.Count; j++)
           {
             string str = list[j];
             if (str.Contains("check"))
             {
                 list.RemoveAt(j);
                 break;
             }
           }
         } 
      }
      catch{}
    }
}
 
  • Спасибо
Реакции: nicanil

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