Code Bye

c#多线程抓取网页

while (count < 14)
            {
                Thread th = new Thread(Test);
                th.Start();
                count++;
            }
void Test()
        {
            WebClient MyWebClient = new WebClient();
            MyWebClient.Credentials = CredentialCache.DefaultCredentials;
            int years;
            string str = @"http://www.278799.com/85556/kj/";
            string str2 = @"C:\Users\administrative\Desktop\data";
            years = count + 2002;
            str += years.ToString() + ".html";
            Byte[] pageData = MyWebClient.DownloadData(str);
            str2 += years.ToString() + ".txt";
            using (FileStream fsWrite = new FileStream(str2, FileMode.OpenOrCreate, FileAccess.Write))
            {
                string pageHtml = Encoding.Default.GetString(pageData); 
                byte[] buffer = Encoding.Default.GetBytes(pageHtml);
                fsWrite.Write(buffer, 0, buffer.Length);
            }
        }

代码如上,本人循环开启了14个新线程,每一个线程抓取不用的网页,一共应该抓取到14个源代码才对,但是真实情况是每次只抓到5-10个,数目不定,网页也不定

解决方案

30

这里的 count,是一个(对各个线程中的代码来说)共享的变量。那么线程执行的那一瞬间,读取到的 count 是什么值就认为是什么值,有可能每一个线程读到的值全都是13,也有可能全都不一样的值。
要让线程中的代码有一个私有的拷贝。例如
            for (var i = 0; i < 1000; i++)
            {
                var j = i;
                ThreadPool.QueueUserWorkItem(h => abc(j));
            }

这样分别执行1000个abc,才会传送1000个不同的值。假如以 i 为参数,那么等 abc 方法被调用时,i 早就不是当初注册线程执行方法的那个 i 值了。

10

引用:
Quote: 引用:

这里的 count,是一个(对各个线程中的代码来说)共享的变量。那么线程执行的那一瞬间,读取到的 count 是什么值就认为是什么值,有可能每一个线程读到的值全都是13,也有可能全都不一样的值。
要让线程中的代码有一个私有的拷贝。例如

            for (var i = 0; i < 1000; i++)
            {
                var j = i;
                ThreadPool.QueueUserWorkItem(h => abc(j));
            }

这样分别执行1000个abc,才会传送1000个不同的值。假如以 i 为参数,那么等 abc 方法被调用时,i 早就不是当初注册线程执行方法的那个 i 值了。

没有看懂你想表达什么

p哥眼光犀利,果然应该是是count的问题。
题主,你要把count作为参数传到线程里去,test方法要定义为:
void Test(int count)
懂不?


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c#多线程抓取网页