Запуск в многопоток простой записи в таблицу

Onegogh

Client
Регистрация
23.12.2015
Сообщения
71
Благодарностей
13
Баллы
8
Привет, друзья!


У меня логика такая - бери из input.txt первую строку с удалением.
Запиши в конец output.xlsx строки которые напарсил.

Все вроде просто, но когда я увеличиваю количество потоков вот так
ZennoPoster Standard 7.7.21.0 by ZennoLab.com_250210113314.png

То вместо того чтобы добавлять данные в output.xlsx каждый поток перезаписывает данные поверх, начиная первой строки.

Не могу понять что я делаю не так.
Код который трогает Output.xlsx только один и выполняется один раз в конце работы каждого потока.

Он следующий (внимание - шапка кода содержит тоже информацию):

Копируем из таблицы preOut(не привязана к файлу) в Output (привязана):
// Берем таблицы
var preTable = project.Tables["preOut"];
var outTable = project.Tables["Output"];

// Лочим код изменения таблицы, чтобы потоки не мешали друг другу
lock (SyncObjects.TableSyncer)
{
    int y = outTable.RowCount;

    project.SendWarningToLog(y.ToString(), "Пишем в output начиная с:", true);


    for (int i = 0; i < preTable.RowCount; i++)
    {
        outTable.AddRow(preTable.GetRow(i).ToArray());
    }

   // preTable.Clear(); // Очищаем preOut после копирования
}
Я вроде все залочил, но в лог выводится отладочная информация о том что все равно не все потоки правильно посчитали количество строк в таблице Output.

ZennoPoster Standard 7.7.21.0 by ZennoLab.com_250210113940.png
 
Последнее редактирование:

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 418
Благодарностей
790
Баллы
113
preTable и outTable засунь тоже в лок


C#:
lock (SyncObjects.TableSyncer)
{
    var preTable = project.Tables["preOut"];
    var outTable = project.Tables["Output"];

    int y = outTable.RowCount;

    project.SendWarningToLog(y.ToString(), "Пишем в output начиная с:", true);


    for (int i = 0; i < preTable.RowCount; i++)
    {
        outTable.AddRow(preTable.GetRow(i).ToArray());
    }

   // preTable.Clear(); // Очищаем preOut после копирования
}
 
Последнее редактирование:
  • Спасибо
Реакции: Sok0lov и Onegogh

Onegogh

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

Onegogh

Client
Регистрация
23.12.2015
Сообщения
71
Благодарностей
13
Баллы
8
preTable и outTable засунь тоже в лок
Скажи пожалуйста, если таблица не привязана к файлу, то лочить ее надо или не надо? То есть каждый поток создает копию этой таблицы и независимо с ней работает, или все они дружно юзают один экземпляр по очереди?
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 418
Благодарностей
790
Баллы
113
Скажи пожалуйста, если таблица не привязана к файлу, то лочить ее надо или не надо? То есть каждый поток создает копию этой таблицы и независимо с ней работает, или все они дружно юзают один экземпляр по очереди?
В моём понимании надо, я Рихтера до дыр не зачитывал, но как я понимаю, происходит следующее


var preTable = project.Tables["preOut"];
var outTable = project.Tables["Output"];

Вот в этой точке поток получает текущее состояние таблиц

Потом он встаёт в очередь перед локом.

Первый поток заходит в лок и начинает производить действия с таблицей, затем он выходит из лока

И когда второй поток заходит в лок он видит состояние таблицы которое было до того как он встал в очередь, а не то которое у таблиц стало после выхода первого потока из лока где он их отредактировал
 

Onegogh

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

Так, нашел
 

Onegogh

Client
Регистрация
23.12.2015
Сообщения
71
Благодарностей
13
Баллы
8
Не понимаю. Вот я вроде все залочил, но в output пусто
 

Вложения

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 418
Благодарностей
790
Баллы
113
версию бы понизить до 7.7.12
 

Onegogh

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

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 418
Благодарностей
790
Баллы
113

Onegogh

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

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 418
Благодарностей
790
Баллы
113
C#:
var tets = project.Directory;

var preTable = project.Tables["out"];

var outTable = project.Tables["preout"];


lock (outTable) // Лочим только добавление строк
{
    for (int i = 0; i < preTable.RowCount; i++)
    {
   
        outTable.AddRow(preTable.GetRow(i).ToArray());
   
        outTable.AddRow(new[]{"строка1","строка2","строка3" });
    }
}

Всё работает.

Ты добавляешь строки outTable.AddRow(new[]{"строка1","строка2","строка3" }); в таблицу var outTable = project.Tables["preout"]; в таблице preout они появляются.


А если переменные правильно объявить то и в файл все писаться начнет


C#:
var preTable = project.Tables["preout"];



var outTable = project.Tables["out"];
 

Onegogh

Client
Регистрация
23.12.2015
Сообщения
71
Благодарностей
13
Баллы
8
Наверно мне надо перезагрузить комп
 

Onegogh

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

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