void SearchThread()//Метод пошуку, який виконуэтся в заданих потоках { while (linkComplete < total) //Виконуєтся доки є можливість наявності посилань для обробки { bool work = false; LinkStat link = new LinkStat(); lock (lockCurentEl) { if (curentEl < total) //Перевірка наявності не обробленних посилань { link = links[curentEl]; curentEl++; work = true; } } if (work) //Пошук текста за посиланням { link.Status = "Loading"; WebClient web = new WebClient(); try { //Завантаження сторінки за посиланням string html = web.DownloadString(link.Link); string nohtml = DeleteTags(html); //Пошук текста на сторінці if (nohtml.IndexOf(text) == -1) { link.Status = "Not fond"; } else { link.Status = "Find"; } //Пошук посилань на сторінці Match m = Regex.Match(html, linkpattern); while (m.Success) { lock (lockTotal) { if (total < linkNum) { links.Add(new LinkStat() { Link = m.Value, Status = "Wait" }); total++; m = m.NextMatch(); } else break; } } } catch (Exception ex) { link.Status = ex.Message; } finally { lock (locklinkComplete) //Збільшення кількості обробленних посилань { linkComplete++; } } } } }
public void Start(MainWindow win,string url, int thrNum, string searchText, int urlNum )//Метод запуску потоків, або оновлення їх роботи { window = win; if (status == 0)//Стоврення потоків обробки, а також ініціалізація змінних { threadsNum = thrNum; text = searchText; linkNum = urlNum; links = new List<LinkStat>(linkNum); LinkStat link = new LinkStat() { Link = url, Status = "Wait" }; links.Add(link); total = 1; curentEl = 0; linkComplete = 0; mainThread = new Thread(ControlThread); mainThread.Start(); threads = new Thread[threadsNum]; for (int i = 0; i < threadsNum; i++) { threads[i] = new Thread(SearchThread); threads[i].Start(); } } else { //Відновлення роботи потоків вразі їх зупинки mainThread.Resume(); for (int i = 0; i < threadsNum; i++) { threads[i].Resume(); } } }