Вопрос по C#: Память <=> Поток <=> Процесс <=> Поток <=> Память

Регистрация
05.06.2019
Сообщения
570
Благодарностей
453
Баллы
63
Доброго времени! Необходимо понимание, чтобы развеять невежество...

П.С. Я только учусь, нашел код в интернете, хочу разобраться с тем, как грамотно и лаконично писать код.
Интересует больше состояние памяти между потоками в одном процессе (синоним база), ниже приведу пару примеров кода..

Задача:
Добавить на сайт 100 публикаций

Вступление:
Перед запуском шаблона

Настройки ZennoPoster, вкладка "Потоки":
  • Максимальное кол-во потоков: 40
  • Кол-во потоков в одном процессе: 4
Запуск шаблона:
Настраивая шаблон перед запуском, значения:
  • Сколько сделать: 100
  • Максимум потоков: 10
З.Ы. Создается 3 базы (10 / 4) и в 3-х этих коробочка, происходит какая-то движуха



Ок, алгоритм программы:
Есть файл дб, в котором 1-ая строка: Заголовки, последующие строки: Значения
Шаблон не зациклен, у него есть точка входа и выхода и полный проход это 1 выполнение.

Вариант №1
Свой C# код:
string pathFile = project.Directory + @"\db.csv";

List<string> file = new List<string>(); //File.ReadAllLines(pathFile).ToList();
List<string> header = new List<string>();

int lineNumber = 1;
     
if(file.Count == 0)
{
    file = File.ReadAllLines(pathFile).ToList();
    header = file[0].Split(';').ToList();        
}
Вариант №2
C#:
class Program
{
    static List<string> file;
    static List<string> header;
 
    void SetValue()
    {
        string pathFile = project.Directory + @"\db.csv";
     
        //код...
     
        lock(lockFile)
        {
            if(file == null)
            {
                file = File.ReadAllLines(pathFile).ToList();
                header = file[0].Split(';').ToList();        
            }

        //код...
Вопрос:
из Вариант №1
Нужно ли, делать проверку списка C#, перед тем, чтобы его связать с файлом?
Проверка списка:
if(file.Count == 0)
В базе 4 потока, но для каждого создается отдельный список?
Если я правильно понимаю, то нет смысла делать данную проверку, а сразу можно привязать файл к List<string> и содержимое между потоками не будет перемешиваться?

из Вариант №2
Тот же самый вопрос, разница лишь в реализации кода в "Общем коде", если ли смысл проверять инициализирован ли список (типо, что в нем может хранятся "данные" от другого потока?)
C#:
if(file == null)
На заметку:
База (изолированное пространство) - ? оператор контролирующий процесс работы потоков? то есть если поток где-то потерялся (завис в бесконечном цикле), база может принудительно завершить его, есть возможность с ней общаться в реалтайм?
Пример: состояние потоков (% выполнения от 100% задачи), сколько времени работает 1 поток, отрубить поток? Получить скрин браузера?
 
  • Спасибо
Реакции: alcampo

Phoenix78

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

а вот логика про привязывание к файлу что то захромала. ни в одном примере нет привязки к файлу, только копирование из файла в созданный список данных. в первом случае список будет всегда пустой, так как только создан,
а вот во втором случае списки уже принадлежат классу Program и они общие для всех процедур этого класса. и наверно все таки нужна проверка на затирание. Но это же вас код, как решите так и будет. И естественно класс Program принадлежит текущему потоку :-)
Потоки в зенке полностью изолированы между собой. Нет смысла забивать голову перепутыванием данных в многопоточности. Надо думать только о локировании общих внешних ресурсах.
 
  • Спасибо
Реакции: Маломальский
Регистрация
05.06.2019
Сообщения
570
Благодарностей
453
Баллы
63
1. слишком много букв.
2. ни в одном примере нет привязки к файлу
1. Согласен, но чтобы поймать одну волну
2. Ошибся, понятно, что перенести содержимое файла во временый список.

В принципе все понятно, сомнения укрепились, так как изначально понял, что пример кода, излишен ненужными строками.
Феникс, благодарю за обратную связь!
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 383
Благодарностей
3 306
Баллы
113
Кол-во потоков в одном процессе: 4
Это актуально только для FF45, остальные как при галке "выделенный процесс".
База (изолированное пространство) - ? оператор контролирующий процесс работы потоков? то есть если поток где-то потерялся (завис в бесконечном цикле), база может принудительно завершить его, есть возможность с ней общаться в реалтайм?
База - это *base*.exe в ней находится инстанс браузера, а сам код шаблона выполняется в ZennoPoster.exe.
Обычно если зависает браузер, то он остаётся висеть, пока процесс базы не убьют. Как помню, таска с принудительным завершением была готова.

Шаблоны в каких-то версиях ZennoPoster.exe работали как Task'и, с недавнего времени были переведены на Thread'ы, так как были сомнения из-за одного бага.
Thread - работа в отдельном асинхронном потоке, Task - тоже асинхронен, но может не создавать отдельный поток, а выполняет разный код как в конечном автомате.

Шаблон нельзя корректно прибить. Я поднимал тему с шаблонами в отдельных процессах, но задача сложная и синхронизация между процессами будет больным местом, как пример - багованая отладка в PM.
 
Последнее редактирование:
  • Спасибо
Реакции: Маломальский

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