以前没有弄过多线程,有点混乱;大家帮我看一下,程序的逻辑,后面的多线处理,执行几次程序就没有响应了,大家帮我看看,要怎么样写这个流程会比较好。分数会在满意答案出现的时候再加。int operCount = DataOper.ExecSql("update data_source_set set data_isoper=0");
int threadNum = int.Parse(default_threadNum.Text);
download = new Thread[threadNum];
if (operCount > 0) //如果要处理的任务数大于0,则启用线程
{
try
{
while(operCount>0)
{
for (int i = 0; i < threadNum; i++)
{
Thread t = new Thread(new ThreadStart(spider_oper));
download[i] = t;
download[i].Name = "Thread" + i.ToString();
download[i].Start();
while (download[i].IsAlive)
Thread.Sleep(5);
statsInfo.Text = "线程" + (i + 1).ToString() + "正在启动";
operCount--; if (operCount == 0)
{
if (download[i].ThreadState == ThreadState.Running)
{
download[i].Abort();
download[i].Join();
}
break;
}
}
}
statsInfo.Text = "数据分析中";
bool isOver = true;//标识抓取任务是否完成
download = new Thread[threadNum];
while (isOver)
{
DataTable opdataTable = DataOper.getStaticTable("select top 100 opurl,optitle,oppath,opchar,opcur,opdepth from spider_operurl");
int opdataNum = opdataTable.Rows.Count;
//如果有可操作的数据
if (opdataNum > 0)
{
#region 多线处理
try
{
for (int i = 0; i < threadNum; i++)
{
for (int kk = 0; kk < opdataNum; kk++)
{
spider_url = opdataTable.Rows[kk]["opurl"].ToString();
spider_path = opdataTable.Rows[kk]["oppath"].ToString();
spider_dchar = opdataTable.Rows[kk]["opchar"].ToString();
spider_curThread = i + 1;
spider_depth = opdataTable.Rows[kk]["opdepth"].ToString();
#region 开始操作多线程
Thread t = new Thread(new ThreadStart(runThread));
download[i] = t;
download[i].Name = "Thread" + spider_curThread.ToString();
download[i].Start();
while (download[i].IsAlive)
Thread.Sleep(5);
statsInfo.Text = download[i].Name + "正在处理:" + spider_url;
#endregion
}
}
}
catch (SynchronizationLockException ex)
{
getSingleWeb.addErrMsg(errlist, DateTime.Now.ToString(), ex.Message);
}
finally
{
}
#endregion
}
else
{
isOver = false;
}
}
for (int i = 0; i < threadNum; i++)
{
if (download[i].ThreadState == ThreadState.Running)
{
this.statsInfo.Text = "正在终止线程" + (i + 1).ToString();
download[i].Abort();
download[i].Join();
}
}
}
catch (ThreadStateException ex)
{
getSingleWeb.addErrMsg(errlist, DateTime.Now.ToString(), ex.Message);
}
}
int threadNum = int.Parse(default_threadNum.Text);
download = new Thread[threadNum];
if (operCount > 0) //如果要处理的任务数大于0,则启用线程
{
try
{
while(operCount>0)
{
for (int i = 0; i < threadNum; i++)
{
Thread t = new Thread(new ThreadStart(spider_oper));
download[i] = t;
download[i].Name = "Thread" + i.ToString();
download[i].Start();
while (download[i].IsAlive)
Thread.Sleep(5);
statsInfo.Text = "线程" + (i + 1).ToString() + "正在启动";
operCount--; if (operCount == 0)
{
if (download[i].ThreadState == ThreadState.Running)
{
download[i].Abort();
download[i].Join();
}
break;
}
}
}
statsInfo.Text = "数据分析中";
bool isOver = true;//标识抓取任务是否完成
download = new Thread[threadNum];
while (isOver)
{
DataTable opdataTable = DataOper.getStaticTable("select top 100 opurl,optitle,oppath,opchar,opcur,opdepth from spider_operurl");
int opdataNum = opdataTable.Rows.Count;
//如果有可操作的数据
if (opdataNum > 0)
{
#region 多线处理
try
{
for (int i = 0; i < threadNum; i++)
{
for (int kk = 0; kk < opdataNum; kk++)
{
spider_url = opdataTable.Rows[kk]["opurl"].ToString();
spider_path = opdataTable.Rows[kk]["oppath"].ToString();
spider_dchar = opdataTable.Rows[kk]["opchar"].ToString();
spider_curThread = i + 1;
spider_depth = opdataTable.Rows[kk]["opdepth"].ToString();
#region 开始操作多线程
Thread t = new Thread(new ThreadStart(runThread));
download[i] = t;
download[i].Name = "Thread" + spider_curThread.ToString();
download[i].Start();
while (download[i].IsAlive)
Thread.Sleep(5);
statsInfo.Text = download[i].Name + "正在处理:" + spider_url;
#endregion
}
}
}
catch (SynchronizationLockException ex)
{
getSingleWeb.addErrMsg(errlist, DateTime.Now.ToString(), ex.Message);
}
finally
{
}
#endregion
}
else
{
isOver = false;
}
}
for (int i = 0; i < threadNum; i++)
{
if (download[i].ThreadState == ThreadState.Running)
{
this.statsInfo.Text = "正在终止线程" + (i + 1).ToString();
download[i].Abort();
download[i].Join();
}
}
}
catch (ThreadStateException ex)
{
getSingleWeb.addErrMsg(errlist, DateTime.Now.ToString(), ex.Message);
}
}
解决方案 »
- [惊奇][不解][疑惑]MouseDown 和 MouseUp 顺序的问题
- datagridview 下拉列表
- oracle与.net开发的一个问题
- 请问大家线程怎么传参数啊
- 求助!存储过程参数出错问题 请指教!C#
- 高手赐教(ASP。NET小问题)~!!新来的。。。
- 我在显示从SQL SERVER数据库里读出的图片时,想显示在IMAGE里,而ID又不定,其是由查询结果来决定的。如何解决该问题,在线立结
- 求助: 關於return問題
- 几个关于在C#中与操作系统交互的问题?
- 我问我周围男的,他们也不知道是怎么回事,所以请你们帮帮我,谢谢咯
- Oracle数据库表结构导入到SQL SERVER
- 求教遍历文件夹下文件的问题
{
for (int i = 0; i < threadNum; i++)
{这两层循环共开了多少线程?
2000?3000?
用到的表有三个,一个是data_source_set,用来存放要处理的地址,其中有一个url字段是要去爬的地址入口,还有一个字段是标识该任务是否被处理了;当然还有其它字段,这里就不说了。
第二个表是分析后的表,用来存放对地址分析后的一些数据,其中有一个filepath字段用来放分析后的网页代码文件路径(就是提取出来的代码,作为本地文件存放起来,filepath就是被存储的这个文件的存放位置)
第三个表是用来显示的结果表spider_BotDetails,用来存放前面分析处理出来的标题,关键字和描述等
所以我要做的第一步是:
从data_source_set表中取出要分析处理的url列表,并初步对这些页面进行第一次抓取,将入口页中符合条件的页码保存到本地来,即初始化;
第二步是:
依次读取上一步中保存在本地的文件,然后把它进行处理,存放在一个datatable中。
datatable有两列,title和url
如果datatable的行大于0,则像第一步一样,对这个地址进行分析,将符合条件的代码存到本地。把本步骤中分析的那条数据从数据库中删除,然后把新的任务写入数据库中。这样子反复循环下去,直到第二个表中没有数据为止;
不知道我的描述够不够清楚。有兴趣的朋友可以找我要源文件。