我是很新,所以请原谅任何无知。
我创建了我的第一个多线程应用程序,它的目的是使众多webrequests,分析每个页面的源代码,并将结果保存在进一步审讯表。 理论上可能有多达30-40000的要求,因此需要多线程。 每个请求获得一个线程。 我觉得一切正常,只是我经常只得到一个非常局部页面的源代码。 这是几乎一样,如果在读取响应的StreamReader无谓的干扰。 我去用相同的请求,浏览器,并得到整个页面。 我认为它可能有,虽然我觉得我还是同步拨打电话与线程做。 (理想情况下,我想这样做异步调用,但我不知道如何去说。)有没有知道的一种方式,如果页面的源代码是完全以确定是否再次请求? 我相信这里有复杂性,我很想念。 在任何代码的任何帮助将不胜感激。
很抱歉的格式。 下面是使请求的类的部分代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Threading;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;
namespace M4EverCrawler
{
public class DomainRun
{
public void Start()
{
new Thread(new ThreadStart(this.Run1)).Start();
new Thread(new ThreadStart(this.Run2)).Start();
new Thread(new ThreadStart(this.Run3)).Start();
}
public DomainRun(DNQueueManager dnq, ProxyQueueManager prxQ)
{
dnqManager = dnq;
ProxyManager = prxQ;
}
private DNQueueManager dnqManager;
private ProxyQueueManager ProxyManager;
public StagingQueue StagingQueue = new StagingQueue();
public MetricsQueueManager MQmanager = new MetricsQueueManager();
public CommitQueueManager CQmanager = new CommitQueueManager();
protected void Run1()
{
dnqManager.LoadDNs();
ProxyManager.LoadProxies();
while (true)
{
if (dnqManager.IsDNDavailable)
{
DomainData dnd = dnqManager.GetDND();
dnd.PageSource = CapturePage(dnd.DomainName);
StagingQueue.AddDN2Q(dnd);
}
Thread.Sleep(new Random().Next(20));
}
}
protected void Run2()
{
while (true)
{
if (StagingQueue.IsDNDavailable)
{
DomainData dnd = StagingQueue.GetDND();
MaxOutboundLinks = 3;
AvoidHttps = true;
InsideLinks = false;
VerifyBackLinks = true;
MQmanager.AddDN2Q(ParsePage(dnd));
foreach (string link in dnd.Hlinks)
{
DomainData dndLink = new DomainData(dnd.MainSeqno,link.ToString());
dndLink.ParentDomainName = dnd.DomainName;
dnd.PageSource = String.Empty;
MQmanager.AddDN2Q(dndLink);
}
}
Thread.Sleep(new Random().Next(20));
}
}
protected void Run3()
{
while (true)
{
if (MQmanager.IsDNDavailable)
{
DomainData dnd = MQmanager.GetDND();
RunAlexa(dnd);
RunCompete(dnd);
RunQuantcast(dnd);
CQmanager.AddDN2Q(dnd, MQmanager, 1000);
}
Thread.Sleep(new Random().Next(20));
}
}
private string CapturePage(string URIstring)
{
Uri myUri;
try
{
myUri = new Uri(URIstring);
}
catch (Exception URIex)
{
return String.Empty;
}
string proxyIP = ProxyManager.GetCurrentProxy() == "" ? ProxyManager.GetProxy() : ProxyManager.GetCurrentProxy();
int proxCtr = 0;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(myUri);
WebProxy Proxy = new WebProxy(proxyIP);
request.Proxy = Proxy;
request.Timeout = 20000;
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader strmRdr = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
{
return strmRdr.ReadToEnd();
}
}
}
catch (InvalidOperationException Wex)
{
. . .
}
}