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