以前没有弄过多线程,有点混乱;大家帮我看一下,程序的逻辑,后面的多线处理,执行几次程序就没有响应了,大家帮我看看,要怎么样写这个流程会比较好。分数会在满意答案出现的时候再加。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);
                    }
                }

解决方案 »

  1.   

    while(operCount>0)
    {
    for (int i = 0; i < threadNum; i++)
    {这两层循环共开了多少线程?
    2000?3000?
      

  2.   

    我这个程序是一个蜘蛛程序。
    用到的表有三个,一个是data_source_set,用来存放要处理的地址,其中有一个url字段是要去爬的地址入口,还有一个字段是标识该任务是否被处理了;当然还有其它字段,这里就不说了。
    第二个表是分析后的表,用来存放对地址分析后的一些数据,其中有一个filepath字段用来放分析后的网页代码文件路径(就是提取出来的代码,作为本地文件存放起来,filepath就是被存储的这个文件的存放位置)
    第三个表是用来显示的结果表spider_BotDetails,用来存放前面分析处理出来的标题,关键字和描述等
    所以我要做的第一步是:
    从data_source_set表中取出要分析处理的url列表,并初步对这些页面进行第一次抓取,将入口页中符合条件的页码保存到本地来,即初始化;
    第二步是:
    依次读取上一步中保存在本地的文件,然后把它进行处理,存放在一个datatable中。
    datatable有两列,title和url
    如果datatable的行大于0,则像第一步一样,对这个地址进行分析,将符合条件的代码存到本地。把本步骤中分析的那条数据从数据库中删除,然后把新的任务写入数据库中。这样子反复循环下去,直到第二个表中没有数据为止;
    不知道我的描述够不够清楚。有兴趣的朋友可以找我要源文件。
      

  3.   

    是Thread.Sleep(5)被不停的累加了!才导致失去响应了!
      

  4.   

    这个线程好像不是只得是你的每个线程数组里的线程的,是只当前currentThread !
      

  5.   

    不是累加引起的,因为把Thread.Sleep(5)去掉也是一样的卡死。