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); }