C#} For循环问题

时间:2016-07-22 03:25:21

标签: c# multithreading pdf webclient

您好我的学校有记录,我需要访问但我忘记了我的用户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);
      }
    }
  }
}

1 个答案:

答案 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#?