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

Onegogh

Client
Joined
Dec 23, 2015
Messages
71
Reaction score
13
Points
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
 
Last edited:

Sherminator

Client
Joined
Sep 10, 2021
Messages
1,418
Reaction score
794
Points
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 после копирования
}
 
Last edited:
  • Thank you
Reactions: Sok0lov and Onegogh

Onegogh

Client
Joined
Dec 23, 2015
Messages
71
Reaction score
13
Points
8

Onegogh

Client
Joined
Dec 23, 2015
Messages
71
Reaction score
13
Points
8
preTable и outTable засунь тоже в лок
Скажи пожалуйста, если таблица не привязана к файлу, то лочить ее надо или не надо? То есть каждый поток создает копию этой таблицы и независимо с ней работает, или все они дружно юзают один экземпляр по очереди?
 

Sherminator

Client
Joined
Sep 10, 2021
Messages
1,418
Reaction score
794
Points
113
Скажи пожалуйста, если таблица не привязана к файлу, то лочить ее надо или не надо? То есть каждый поток создает копию этой таблицы и независимо с ней работает, или все они дружно юзают один экземпляр по очереди?
В моём понимании надо, я Рихтера до дыр не зачитывал, но как я понимаю, происходит следующее


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

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

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

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

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

Onegogh

Client
Joined
Dec 23, 2015
Messages
71
Reaction score
13
Points
8
130393

Так, нашел
 

Onegogh

Client
Joined
Dec 23, 2015
Messages
71
Reaction score
13
Points
8
Не понимаю. Вот я вроде все залочил, но в output пусто
 

Attachments

Sherminator

Client
Joined
Sep 10, 2021
Messages
1,418
Reaction score
794
Points
113
версию бы понизить до 7.7.12
 

Onegogh

Client
Joined
Dec 23, 2015
Messages
71
Reaction score
13
Points
8

Sherminator

Client
Joined
Sep 10, 2021
Messages
1,418
Reaction score
794
Points
113

Onegogh

Client
Joined
Dec 23, 2015
Messages
71
Reaction score
13
Points
8

Sherminator

Client
Joined
Sep 10, 2021
Messages
1,418
Reaction score
794
Points
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
Joined
Dec 23, 2015
Messages
71
Reaction score
13
Points
8
Наверно мне надо перезагрузить комп
 

Onegogh

Client
Joined
Dec 23, 2015
Messages
71
Reaction score
13
Points
8
если переменные правильно объявить
Да, спасибо. Глаз замылился на сложных вещах, а простые пропустил как всегда.
 

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