Проблема с многопоточностью и параметрами файла c# - PullRequest
1 голос
/ 04 мая 2020

Моя цель - создать выходной файл, который будет анализировать все URL в результате.

Моя проблема: я использую Paralelism, и он не может быть связан с File, потому что он защищен, я пытаюсь установить блокировку, и я думаю, что я не правильно выразился сообщение об ошибке:
Процесс не может получить доступ, потому что он используется другим процессом файл

Что я хочу: результат сохраняется в текстовом файле

Код:

//VARIABLE
        List<string> dorklist = File.ReadAllLines("dorks.txt").ToList();
        int numdork = File.ReadAllLines("dorks.txt").Length;
        int totalurls = File.ReadAllLines("Queue.txt").Length;
        int chekeddork = 0;
        int errors = 0;
        File.Create("Queue.txt");
        //TITLE

        Task.Factory.StartNew(() =>
        {
            while (true) {
                Console.Title = ("PARSER | " + chekeddork + "/" + numdork + " URLS : " + totalurls);
                Thread.Sleep(100);
            }
        });
        //BOUCLE
        Parallel.ForEach(dorklist, new ParallelOptions { MaxDegreeOfParallelism = 100 }, dorklist => {
            try
            {
                using (HttpRequest req = new HttpRequest())
                {
                    //HEADERS
                    req.AddHeader(HttpHeader.UserAgent, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0");

                    //REQUESTS
                    var content = req.Get("https://www.google.com/search?q="+dorklist);
                    if (Convert.ToString(content.StatusCode) == "OK")
                    {
                        chekeddork++;
                        Console.WriteLine("Dork used : " + dorklist);
                        HtmlDocument doc = new HtmlDocument();
                        doc.LoadHtml(content.ToString());
                        var links = doc.DocumentNode.SelectNodes("//div[@class='r']//a");
                        foreach (var link in links)
                        {
                            var href = link.Attributes["href"];
                            var result = href.Value.ToString();
                            using (StreamWriter streamaze = new StreamWriter("Queue.txt", true))
                                    {
                                        streamaze.WriteLine(results);
                                        streamaze.Close();
                                    }
                        }


                    }
                    else
                    { Console.WriteLine("Bad");
                        errors++;
                    }

                }
            }
            catch (HttpException)
            {
                Console.WriteLine("Banned");
                errors++;
            }
        });
        }

    }
}

И проблема здесь: `

using (StreamWriter streamaze = new StreamWriter("Queue.txt", true))
                                {
                                    streamaze.WriteLine(results);
                                    streamaze.Close();

Потому что есть Parallel.ForEach и maxdegree Спасибо всем, помогите мне

1 Ответ

0 голосов
/ 04 мая 2020

Вы не можете записывать в один файл из нескольких потоков одновременно через отдельные открытия.

Открывать отдельные файлы для каждого потока и объединять их впоследствии. Или откройте файл один раз перед параллельным foreach и, заперев, запишите в один открытый файл. Или поместите это, используя внутри замка

lock(dorkList) // or create a lock object
{
     using (StreamWriter streamaze = new StreamWriter("Queue.txt", true))
     {
       streamaze.WriteLine(results);
       streamaze.Close();
     }
}

или используйте указанный c объект блокировки, подобный этому

    int chekeddork = 0;
    int errors = 0;
    File.Create("Queue.txt");
    object locker = new Object();
    ....
    lock(locker) // or create a lock object
    {
       using (StreamWriter streamaze = new StreamWriter("Queue.txt", true))
       {
         streamaze.WriteLine(results);
         streamaze.Close();
       }
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...