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)
懂不?