C# 多线程和文件选项c出现问题#
我的目标是创建一个输出文件,解析结果中的所有urlC# 多线程和文件选项c出现问题#,c#,file,C#,File,我的目标是创建一个输出文件,解析结果中的所有url using (StreamWriter streamaze = new StreamWriter("Queue.txt", true)) { streamaze.WriteLine(results); streamaze.Close();
using (StreamWriter streamaze = new StreamWriter("Queue.txt", true))
{
streamaze.WriteLine(results);
streamaze.Close();
我的问题是:
我使用平行排列,他不能与文件关联,因为它是安全的,
我试着把锁锁上,但我想我没有把它锁好
消息错误为:该进程无法访问,因为文件中的另一进程正在使用它
using (StreamWriter streamaze = new StreamWriter("Queue.txt", true))
{
streamaze.WriteLine(results);
streamaze.Close();
我想要的是:
结果保存在txt文件中
using (StreamWriter streamaze = new StreamWriter("Queue.txt", true))
{
streamaze.WriteLine(results);
streamaze.Close();
代码:
//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
多亏了所有帮助我您不能通过单独的打开同时从多个线程写入一个文件
using (StreamWriter streamaze = new StreamWriter("Queue.txt", true))
{
streamaze.WriteLine(results);
streamaze.Close();
每个线程打开单独的文件,然后合并。
或者在并行foreach之前打开该文件一次,并在锁定下写入一个打开的文件。
或者把它放在锁里
using (StreamWriter streamaze = new StreamWriter("Queue.txt", true))
{
streamaze.WriteLine(results);
streamaze.Close();
lock(dorkList) // or create a lock object
{
using (StreamWriter streamaze = new StreamWriter("Queue.txt", true))
{
streamaze.WriteLine(results);
streamaze.Close();
}
}
或者像这样使用特定的锁对象
using (StreamWriter streamaze = new StreamWriter("Queue.txt", true))
{
streamaze.WriteLine(results);
streamaze.Close();
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();
}
}
不能通过单独的打开同时从多个线程写入一个文件
using (StreamWriter streamaze = new StreamWriter("Queue.txt", true))
{
streamaze.WriteLine(results);
streamaze.Close();
每个线程打开单独的文件,然后合并。
或者在并行foreach之前打开该文件一次,并在锁定下写入一个打开的文件。
或者把它放在锁里
using (StreamWriter streamaze = new StreamWriter("Queue.txt", true))
{
streamaze.WriteLine(results);
streamaze.Close();
lock(dorkList) // or create a lock object
{
using (StreamWriter streamaze = new StreamWriter("Queue.txt", true))
{
streamaze.WriteLine(results);
streamaze.Close();
}
}
或者像这样使用特定的锁对象
using (StreamWriter streamaze = new StreamWriter("Queue.txt", true))
{
streamaze.WriteLine(results);
streamaze.Close();
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();
}
}
我尝试使用lock,但我知道它是如何工作的这是我第一次使用它,我不知道如何创建与之相关的lock对象保持不工作,我必须将锁(lock)放在foreach中,对吗?是的,每个锁都在平行线内。在我尝试使用lock之前,lock对象声明已经存在,但idk它是如何工作的这是我第一次使用它,我不知道如何创建与之相关的lock对象保持不工作,我必须将锁(lock)放在foreach中,对吗?是的,每个锁都位于平行线内。lock对象声明在您使用此代码以糟糕的方式做很多事情之前就已经存在了。你不能在
并行机内执行chekeddork++
。ForEach
-你冒着竞争条件的风险。您也可以在Parallel.ForEach
中编写相同的文件。您还编写了代码,使其成为一大块代码,而不是分离正在执行的函数。此外,不要将锁放在并行程序中。ForEach
除非您无法避免它。说你想让事情并行运行,然后又说你不想让事情并行运行,这没有多大意义。你用这段代码做了很多事情。你不能在并行机内执行chekeddork++
。ForEach
-你冒着竞争条件的风险。您也可以在Parallel.ForEach
中编写相同的文件。您还编写了代码,使其成为一大块代码,而不是分离正在执行的函数。此外,不要将锁放在并行程序中。ForEach
除非您无法避免它。说你想让事情并行运行,然后又说你不想让事情并行运行,这没有多大意义。