Мозг не выдерживает, как создать ... этот многопоток?

SToRm1kkk

Client
Регистрация
29.12.2019
Сообщения
19
Благодарностей
4
Баллы
3
Привет, я первоклашка :ch: в мире c# по этому прошу помощи.

Ниже код работает в один поток, цель взять ссылку на беклинк из файла links.txt и проверить в HTML коде есть ли на этой странице ссылка(ссылки) с файла find.txt
Работает все ок, но если закинуть в файл с беклинками 20-30 тысяч страниц, можно идти спать :dj:.

Пробовал читать и делать по примеру как тут --> https://zennolab.com/discussion/threads/parallelnye-zaprosy.19609/ но из того что пробовал нечего не выходит или простыми словами (читаю и не понимаю зачем я это читаю потому понимание нет :bb:)

Проверка беклинков на наличие ссылок:
instance.ClearCookie();
instance.ClearCache();

//Привязка файла с беклинками
IZennoList SL = project.Lists["file_input"];
SL.Clear();
var filePathSL= project.Directory + @"\in\links.txt";
SL.Bind(filePathSL);
project.SendInfoToLog(SL.Count.ToString() + " ссылок в которых будем искать", true);

//Привязка файла с ссылками которые будем искать
IZennoList SSL = project.Lists["search_site_link"];
SSL.Clear();
var filePathSSL= project.Directory + @"\in\find.txt";
SSL.Bind(filePathSSL);
project.SendInfoToLog(SSL.Count.ToString() + " ссылок которые будем искать", true);

//GET запрос к сайту
List<string> SLTemp = new List<string>();
SLTemp.Clear();
SLTemp.AddRange(SL);
project.SendInfoToLog("Создали временный список для беклинков", true);

//Получаем HTML страницу для поиска
for(int i=0; i < SLTemp.Count; i++)
{
   
    var LinkForGet = SLTemp[i].ToString();
    project.SendInfoToLog(LinkForGet + " Взяли ссылку", true);
    string url = LinkForGet;
    string proxy = "";
    string encoding = "UTF-8";
    var Responce = ZennoPoster.HttpGet(url, proxy, encoding, ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly);
    project.SendInfoToLog("GET к сайту " + project.Variables["site_link"].Value + " получен", true);
   
    //Создаем регулярку для поиска ссылки для чистки урл
    var reggg = @"(?<=https?://)[\w\W]*?(?=/)";
   
    List<string> SSLTemp = new List<string>();
    SSLTemp.Clear();
    SSLTemp.AddRange(SSL);
    project.SendInfoToLog("Создали временный список ссылок которые будем искать", true);
   
    for(int j=0; j < SSLTemp.Count; j++)
    {
       
    var SSLreg = System.Text.RegularExpressions.Regex.Match(SSLTemp[j], reggg).Value;
    project.SendInfoToLog(SSLreg + " Ссылка после регулярки", true);
   
    var Result = System.Text.RegularExpressions.Regex.Match(Responce, SSLreg).Value;
    if(Result != string.Empty)
        {
        string txtPath = project.Directory+@"\out\links_good.txt";
        string txtInfo = string.Join("/n", LinkForGet);
        if (File.ReadAllLines(txtPath).Where(arg => !string.IsNullOrWhiteSpace(arg)).Count() < 1) File.AppendAllText(txtPath, txtInfo);
        else File.AppendAllText(txtPath, Environment.NewLine + txtInfo);
        File.WriteAllLines(txtPath,File.ReadLines(txtPath).Where(arg => !string.IsNullOrWhiteSpace(arg)).Distinct().ToList());
        project.SendInfoToLog(LinkForGet + " найден");
        }
           
    else
        {
        string txtPath = project.Directory+@"\out\links_bad.txt";
        string txtInfo = string.Join("/n", LinkForGet);
        if (File.ReadAllLines(txtPath).Where(arg => !string.IsNullOrWhiteSpace(arg)).Count() < 1) File.AppendAllText(txtPath, txtInfo);
        else File.AppendAllText(txtPath, Environment.NewLine + txtInfo);
        File.WriteAllLines(txtPath,File.ReadLines(txtPath).Where(arg => !string.IsNullOrWhiteSpace(arg)).Distinct().ToList());
        project.SendInfoToLog(LinkForGet + " не найден");
        }
       
    }
       
}
Подскажите как сделать параллельно работающих 5 потоков или больше
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
Дело было вечером, делать было нечего... Накидал пример. Пробовать было не на чем.
Не слишком ли Вы замахнулись для первоклашки то?
C#:
var SL = File.ReadAllLines(Path.Combine(project.Directory, "in", "links.txt")).Where(x=>Uri.IsWellFormedUriString(x, UriKind.Absolute));
project.SendInfoToLog(SL.Count.ToString() + " ссылок в которых будем искать", true);

var SL = File.ReadAllLines(Path.Combine(project.Directory, "in", "find.txt")).Where(x=>Uri.IsWellFormedUriString(x, UriKind.Absolute));
project.SendInfoToLog(SSL.Count.ToString() + " ссылок которые будем искать", true);

int counter = 1;

SL.AsParallel().ForAll(site =>
{
    try
    {
        var found = new List<string>();
        var notfound = new List<string>();
        var html = ZennoPoster.HttpGet(site);
        foreach(var link in SSL)
        {
            if(html.Contains(new Uri(link).Host))
            {
                found.Add(link);
            }
            else notfound.Add(link);
        }
        lock(SyncObject)
        {
            if(found.Count > 0){
                File.AppendAllLines(Path.Combine(project.Directory, "out", "links_good.txt"), new string[]{"\n********\n", string.Join("\n--\n", new[]{site, string.Join("\n",found)})});
            }
            if(notfound.Count > 0)
            {
                File.AppendAllLines(Path.Combine(project.Directory, "out", "links_bad.txt"), new string[]{"\n********\n", string.Join("\n--\n", new[]{site, string.Join("\n",notfound)})});
            }
            project.SendInfoToLog($"counter: {counter++} from {SL.Count} *** {site} *** found: {found.Count} - not found: {notfound.Count}", true);
        }
    }
    catch(Exception ex)
    {
        project.SendWarningToLog($"{site} ERROR: {ex.Message}", true);
    }
});
 
Последнее редактирование:
  • Спасибо
Реакции: SToRm1kkk

SToRm1kkk

Client
Регистрация
29.12.2019
Сообщения
19
Благодарностей
4
Баллы
3
  • Спасибо
Реакции: Alexmd

radv

Client
Регистрация
11.05.2015
Сообщения
3 788
Благодарностей
1 952
Баллы
113

heks

Client
Регистрация
01.10.2013
Сообщения
1 204
Благодарностей
316
Баллы
83
минут за 20-30 можно сделать намного проще если файлы локально находятся на компе
 

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113

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