您好我的学校有记录,我需要访问但我忘记了我的用户ID,所以我制作了一个程序,可以下载任何可能的PDF并搜索他们的名字。如果它找到我的,它会提醒我,但是当程序停止时说"我们发现包含Sean文件名的文件是:xxxxxx.pdf"实际的数字部分将关闭,但是for循环增加了很多,即使这是在一个单独的方法! BTW学校名称将出演!
* B的方式!在Search()中我使用i-10作为临时修复,但我认为它们必须是更好的方法*
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using BitMiracle.Docotic.Pdf; // pdf parser / viewer
using System.IO;
using System.Threading;
namespace XXXXXXX_TEMP
{
class Program
{
static void Main(string[] args)
{
Program p1 = new Program();
p1.Start();
}
private void Start()
{
WebClient wc = new WebClient();
for (int i = 200000; i < 999999999; i = i + 10)
{
try
{
wc.DownloadFile("XXXXXXXXXXXXXXXXXXXXXX/" + i + ".pdf", i + ".pdf");
}
catch (WebException) {
continue;
}
PdfDocument pdf = new PdfDocument(i + ".pdf");
Thread a = new Thread(() => Search(i, pdf));
a.Start();
if (i == 999999) {
Console.ReadLine();
}
}
}
private void Search(int i, PdfDocument pdf)
{
i = i - 10;
String html = pdf.GetText();
if (html.ToLower().Contains("sean"))
{
Console.WriteLine("Found File Containing Sean! File Name Is : " + i + ".pdf\n");
Console.WriteLine("PDF Text = " + html);
}
}
}
}
答案 0 :(得分:0)
您遇到的问题称为closing over the loop variable。您应该仔细研究链接的答案以及它链接到的博客条目。
您问题的直接解决方案是将i
的副本传递给该主题。那就是:
int index = i;
Thread a = new Thread(() => Search(index, pdf));
但是,您可能会发现启动所有这些线程会严重阻碍您的系统,并且将所有这些线程挂起可能会占用资源并导致内存不足异常。更简洁的方法是拨打ThreadPool.QueueUserWorkItem
,如下所示:
ThreadPool.QueueUserWorkItem(o => Search(index, pdf));
或者,在较新版本的.NET中:
Task.Run(() => Search(index, pdf));
有关“即发即弃”线程的详细信息,请参阅Simplest way to do a fire and forget method in C#?。