界面上有“开始”和“停止”按钮。当用户点击开始以后,程序就一直处于运行状态。在每天指定的时间点,从一个网页获取30天的数据,写入数据库。
。
程序结构如下:
private void btn_get_Click(object sender, EventArgs e)
{
compare();
}
private void compare()
{
while(1==1)//无限循环
{
if (time_Now == time_1)//到达指定时间
Get();//获取所有OD
}
}
private void Get()
{
……
DataSet ds= new DataSet();
DataTable dt = ds.Tables[0];
int iCount = dt.Rows.Count;
for (int j = 0; j < 30; j++)//取30天的数据
{
string sDate = DateTime.Now.AddDays(j).ToShortDateString();
for (int i = 0; i < iCount; i++)//
{
string sDepart = dt.Rows[i][0].ToString();//出发城市
string sArrive = dt.Rows[i][1].ToString();//到达城市
GetHTML(sDepart,sArrive);
}
}
private void GetHTML(string sDepart,string sArrive)
{
//获取网页数据库
//写入数据库
}
我现在采用的是BackgroundWorker组件,程序可以正常运行。但是由于一天要取20万左右的数据,后台只有一个线程在运行,速度非常慢。
现在希望能用10个线程来从网页获取数据,该怎么实现呢?
希望各位前辈给以指点,刚接触线程,如果前辈能给个线程的框架出来,将不胜感激。
开10个线程可以,但是速度不能保证就比你现在的速度快。
楼上说的也是问题。不过你可以这样子吧,抓取网页的使用一个独立线程,只负责数据抓取,抓取回来的数据交给另一个线程,该线程做专属的入库操作。如果二者之间不匹配的话,可以适当调整二者的线程。
抓取网页的使用一个独立线程,把数据捉到一个XML, 或队列里面,马上去捉第二个,另一个线程是把抓取回来的数据进行处理, 这样的办法可能会好一点, 处理一条就去掉一条.
用一些线程抓数据,放到队列中,再用一线程从队列中取数据并写到数据库中。
简单高效。