private bool RepeatLock(string data_post_id)
 {
     Post[] posts = PostsContainer.ToArray();
     foreach (Post post in posts)
     {
         if (post.Data_Post_Id == data_post_id)
         {
             return(true);
         }
     }
     return(false);
 }
        private void JSON_Write(int file_number)
        {
            Post[] PostsToSerialize = PostsContainer.ToArray();
            int    _size            = PostsToSerialize.Length;

            Authors[] auth  = new Authors[_size];
            Texts[]   text  = new Texts[_size];
            Link[]    links = new Link[_size];
            PicVids[] pv    = new PicVids[_size];
            for (int i = 0; i < _size; i++)
            {
                auth[i] = new Authors()
                {
                    Author = PostsToSerialize[i].Author, Data_Post_Id = PostsToSerialize[i].Data_Post_Id
                };
                text[i] = new Texts()
                {
                    Text = PostsToSerialize[i].Text, Data_Post_Id = PostsToSerialize[i].Data_Post_Id
                };
                links[i] = new Link()
                {
                    Links = PostsToSerialize[i].Links, Data_Post_Id = PostsToSerialize[i].Data_Post_Id
                };
                pv[i] = new PicVids()
                {
                    MainContent = PostsToSerialize[i].MainContent, Data_Post_Id = PostsToSerialize[i].Data_Post_Id
                };
            }
            //using (FileStream fs = new FileStream("posts" + file_number.ToString() + ".json", FileMode.Append, FileAccess.Write))
            using (FileStream fs = new FileStream("T:\\post" + file_number.ToString() + ".json", FileMode.OpenOrCreate))
            {
                switch (file_number)
                {
                case 1:
                {
                    DataContractJsonSerializer jsonFormatter = new DataContractJsonSerializer(typeof(Texts[]));
                    jsonFormatter.WriteObject(fs, text);
                    break;
                }

                case 2:
                {
                    DataContractJsonSerializer jsonFormatter = new DataContractJsonSerializer(typeof(Link[]));
                    jsonFormatter.WriteObject(fs, links);
                    break;
                }

                case 3:
                {
                    DataContractJsonSerializer jsonFormatter = new DataContractJsonSerializer(typeof(PicVids[]));
                    jsonFormatter.WriteObject(fs, pv);
                    break;
                }

                case 4:
                {
                    DataContractJsonSerializer jsonFormatter = new DataContractJsonSerializer(typeof(Authors[]));
                    jsonFormatter.WriteObject(fs, auth);
                    break;
                }
                }
            }
            //  MessageBox.Show("Поток записи в файл " + file_number.ToString() + " отработал!");
        }
        private void Parsing_Click(object sender, RoutedEventArgs e)
        {
            string       WriteFilePath = @"output.txt";
            ChromeDriver chromeDriver  = new ChromeDriver();

            chromeDriver.Navigate().GoToUrl("https://vk.com/feed");
            string login;
            string password;

            using (StreamReader sw = new StreamReader("login.txt"))
            {
                login    = sw.ReadLine();
                password = sw.ReadLine();
                sw.Close();
            }
            LogIn(login, password, chromeDriver);              //регистрация vk.com
            Thread.Sleep(5000);
            while (Semaphore.iterator != Semaphore.iterations) //АЛГОРИТМ ПЛАНИРОВАНИЯ ПОТОКОВ И РЕСУРСОВ         !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            {
                Thread.Sleep(3000);
                var posts = (from item in chromeDriver.FindElementsByClassName("feed_row") where item.Displayed select item).ToList(); //новостные блоки
                foreach (IWebElement post in posts)
                {
                    if (post.Text == "")
                    {
                        continue;                     //Если новость "существует", бывает пустой блок, а это от него защита
                    }
                    else
                    {
                        if (AdLock(post, "post_date"))
                        {
                            continue;                             //Если это рекламные пост или пост с возвожными друзьями, то мы его пропускаем
                        }
                        else
                        {
                            if (RepeatLock(GetPostId(post)))
                            {
                                continue;
                            }
                            else
                            {
                                Post p = new Post()
                                {
                                    Author       = GetPostAuthor(post),
                                    Text         = GetPostText(post),
                                    Links        = GetPostLinks(post),
                                    MainContent  = GetPostMainContent(post),
                                    Data_Post_Id = GetPostId(post)
                                };
                                PostsContainer.Add(p);
                            }
                            Write_Info_ToFile(post, WriteFilePath);
                        }
                    }
                }
                int[] captions = new int[Semaphore.table.GetUpperBound(1) + 1]; //Определем количество элементов в строке данного table[iterator][];
                for (int j = 0; j < captions.Length; j++)
                {
                    captions[j] = Semaphore.table[Semaphore.iterator, j];
                }
                Thread T1      = new Thread(() => { }); T1.Name = "T1";
                Thread T2      = new Thread(() => { }); T2.Name = "T2";
                Thread T3      = new Thread(() => { }); T3.Name = "T3";
                Thread T4      = new Thread(() => { }); T4.Name = "T4";
                string CanWork = "";
                while (CanWork != "1")
                {
                    using (StreamReader sr = new StreamReader(@"T:\Process.txt"))
                        CanWork = sr.ReadLine();
                    if (CanWork != "1")
                    {
                        Thread.Sleep(5000);
                    }
                }

                for (int i = 0; i < captions.Length; i++)
                {
                    //В каждом case создаём переменные int для каждого случая, потому что потоки будут обращаться к аргументам фаункций JSON_Read/Write
                    //только в конце цикла for (не знаю почему), а так в памяти сразу записывается новая ячейка и ошибок не возникает.
                    //Так же это решило проблему со счётчиком i = 3 и позволило вынести while за цикл, что гарантирует параллельность работы потоков.
                    switch (captions[i])
                    {
                    case 1:
                        int first = captions[i];
                        T1 = new Thread(() => JSON_Write(first));
                        T1.Start();
                        break;

                    case 2:
                        int second = captions[i];
                        T2 = new Thread(() => JSON_Write(second));
                        T2.Start();
                        break;

                    case 3:
                        int third = captions[i];
                        T3 = new Thread(() => JSON_Write(third));
                        T3.Start();
                        break;

                    case 4:
                        int fourth = i;
                        T4 = new Thread(() => JSON_Read(fourth + 1));      //Если читаем файл, то читаем i+1 (то есть важна позиция T4 в таблице);
                        T4.Start();
                        break;
                    }
                }
                while (T1.IsAlive || T2.IsAlive || T3.IsAlive || T4.IsAlive)
                {
                }
                using (StreamWriter sw = new StreamWriter(@"T:\Process.txt", false))
                    sw.WriteLine(2);
                Semaphore.iterator++;
                chromeDriver.Navigate().Refresh();
            }
            MessageBox.Show("Программа завершила сеанс работы!", "Уведомление", MessageBoxButton.OK, MessageBoxImage.Information);
            using (StreamWriter sw = new StreamWriter(@"T:\Process.txt", false))
                sw.WriteLine(2);
        }