public void Abort() { m_ThreadRunning = false; if (m_ThreadState == cGlobalParas.GatherThreadState.Started && IsThreadAlive) { lock (m_threadLock) { if (m_ThreadState == cGlobalParas.GatherThreadState.Started && IsThreadAlive) { m_Thread.Abort(); m_Thread = null; m_ThreadState = cGlobalParas.GatherThreadState.Aborted; } else { m_Thread = null; if (m_ThreadState == cGlobalParas.GatherThreadState.Started) { m_ThreadState = cGlobalParas.GatherThreadState.Aborted;; } } } } else { m_Thread = null; if (m_ThreadState == cGlobalParas.GatherThreadState.Started) { m_ThreadState = cGlobalParas.GatherThreadState.Aborted;; } } m_ThreadState = cGlobalParas.GatherThreadState.Aborted; }
/// <summary> /// 停止当前线程 /// </summary> public void Stop() { //仅在子线程外调用 //设置停止线程标志,线程停止只能等待一个地址采集完成后停止,不能 //强行中断,否则会丢失数据 ///注意:在此只是打了一个标记,线程并没有真正结束 m_ThreadRunning = false; if (m_ThreadState == cGlobalParas.GatherThreadState.Started && IsThreadAlive) { lock (m_threadLock) { //开始检测是否所有线程都以完成或退出 //bool isStop = false; //while (!isStop) //{ // isStop = true; // if (m_ThreadState == cGlobalParas.GatherThreadState.Started && IsThreadAlive) // isStop = false; //} m_Thread = null; if (m_ThreadState == cGlobalParas.GatherThreadState.Started) { m_ThreadState = cGlobalParas.GatherThreadState.Stopped; } } } else { m_Thread = null; if (m_ThreadState == cGlobalParas.GatherThreadState.Started) { m_ThreadState = cGlobalParas.GatherThreadState.Stopped; } } m_ThreadState = cGlobalParas.GatherThreadState.Stopped; }
/// <summary> /// 启动工作线程 /// </summary> public void Start() { if (m_ThreadState != cGlobalParas.GatherThreadState.Started && !IsThreadAlive && !IsCompleted) { lock (m_threadLock) { //设置线程运行标志,标识此线程运行 m_ThreadRunning = true; m_Thread = new Thread(this.ThreadWorkInit); //定义线程名称,用于调试使用 m_Thread.Name = m_TaskID.ToString() + "-" + m_TaskSplitData.BeginIndex.ToString(); m_Thread.Start(); m_ThreadState = cGlobalParas.GatherThreadState.Started; } } }
///���˹��캯�� public cGatherTaskSplit() { //m_TaskManage = TaskManage; //m_TaskID = TaskID; //m_gStartPos = StartPos; //m_gEndPos = EndPos; //m_SavePath = sPath; //m_Cookie = strCookie; //m_WebCode = webCode; //m_IsUrlEncode = IsUrlEncode; //m_UrlEncode = UrlEncode; m_TaskSplitData = new cTaskSplitData (); m_ThreadState = cGlobalParas.GatherThreadState.Stopped; //m_TaskType = TaskType; m_GatherData = new DataTable(); }
/// <summary> /// ֹͣ��ǰ�߳� /// </summary> public void Stop() { //�������߳������ //����ֹͣ�̱߳�־���߳�ֹֻͣ�ܵȴ�һ����ַ�ɼ���ɺ�ֹͣ������ //ǿ���жϣ�����ᶪʧ���� ///ע�⣺�ڴ�ֻ�Ǵ���һ����ǣ��̲߳�û���������� m_ThreadRunning = false; if (m_ThreadState == cGlobalParas.GatherThreadState.Started && IsThreadAlive) { lock (m_threadLock) { //��ʼ����Ƿ������̶߳�����ɻ��˳� //bool isStop = false; //while (!isStop) //{ // isStop = true; // if (m_ThreadState == cGlobalParas.GatherThreadState.Started && IsThreadAlive) // isStop = false; //} m_Thread = null; if (m_ThreadState == cGlobalParas.GatherThreadState.Started) { m_ThreadState = cGlobalParas.GatherThreadState.Stopped; } } } else { m_Thread = null; if (m_ThreadState == cGlobalParas.GatherThreadState.Started) { m_ThreadState = cGlobalParas.GatherThreadState.Stopped; } } m_ThreadState = cGlobalParas.GatherThreadState.Stopped; }
/// <summary> /// ��������߳� /// </summary> public void Start() { if (m_ThreadState != cGlobalParas.GatherThreadState.Started && !IsThreadAlive && !IsCompleted) { lock (m_threadLock) { //�����߳����б�־����ʶ���߳����� m_ThreadRunning = true; m_Thread = new Thread(this.ThreadWorkInit); //�����߳�����,���ڵ���ʹ�� m_Thread.Name =m_TaskID.ToString() + "-" + m_TaskSplitData.BeginIndex.ToString (); m_Thread.Start(); m_ThreadState = cGlobalParas.GatherThreadState.Started; } } }
public void Abort() { m_ThreadRunning = false; if (m_ThreadState == cGlobalParas.GatherThreadState.Started && IsThreadAlive) { lock (m_threadLock) { if (m_ThreadState == cGlobalParas.GatherThreadState.Started && IsThreadAlive) { m_Thread.Abort(); m_Thread = null; m_ThreadState = cGlobalParas.GatherThreadState.Aborted; } else { m_Thread = null; if (m_ThreadState == cGlobalParas.GatherThreadState.Started) { m_ThreadState = cGlobalParas.GatherThreadState.Aborted; ; } } } } else { m_Thread = null; if (m_ThreadState == cGlobalParas.GatherThreadState.Started) { m_ThreadState = cGlobalParas.GatherThreadState.Aborted; ; } } m_ThreadState = cGlobalParas.GatherThreadState.Aborted; }
/// <summary> /// 采集任务 /// </summary> private void ThreadWork() { //cGatherWeb gWeb = new cGatherWeb(); //gWeb.CutFlag =m_TaskSplitData.CutFlag ; bool IsSucceed = false; for (int i = 0; i < m_TaskSplitData.Weblink.Count; i++) { if (m_ThreadRunning == true) { switch (m_TaskSplitData.Weblink[i].IsGathered) { case (int)cGlobalParas.UrlGatherResult.UnGather: e_Log(this, new cGatherTaskLogArgs(m_TaskID, ((int)cGlobalParas.LogType.Info).ToString() + "正在采集:" + m_TaskSplitData.Weblink[i].Weblink + "\n", this.IsErrorLog)); //判断此网址是否为导航网址,如果是导航网址则需要首先将需要采集的网址提取出来 //然后进行具体网址的采集 if (m_TaskSplitData.Weblink[i].IsNavigation == true) { IsSucceed = GatherNavigationUrl(m_TaskSplitData.Weblink[i].Weblink, m_TaskSplitData.Weblink[i].NavigRules, m_TaskSplitData.Weblink[i].IsNextpage, m_TaskSplitData.Weblink[i].NextPageRule); } else { IsSucceed = GatherSingleUrl(m_TaskSplitData.Weblink[i].Weblink, m_TaskSplitData.Weblink[i].IsNextpage, m_TaskSplitData.Weblink[i].NextPageRule); } //如果采集发生错误,则直接调用了onError进行错误处理 //但对于带有导航的网址,一次采集是针对多个网址,如果系统 //停止任务,对于多个网址的采集那就是采集事务未成功,既然不成功 //则不需要增加GatheredUrlCount及其他处理 if (IsSucceed == true) { //每采集完成一个Url,都需要修改当前CurIndex的值,表示系统正在运行,并 //最终确定此分解任务是否已经完成,并且表示此网址已经采集完成 m_TaskSplitData.CurIndex++; e_GUrlCount(this, new cGatherUrlCountArgs(m_TaskID, cGlobalParas.UpdateUrlCountType.UrlCountAdd, 0)); m_TaskSplitData.Weblink[i].IsGathered = (int)cGlobalParas.UrlGatherResult.Succeed; m_TaskSplitData.GatheredUrlCount++; } else { e_GUrlCount(this, new cGatherUrlCountArgs(m_TaskID, cGlobalParas.UpdateUrlCountType.ErrUrlCountAdd, 0)); } break; case (int)cGlobalParas.UrlGatherResult.Succeed: m_TaskSplitData.CurIndex++; m_TaskSplitData.GatheredUrlCount++; m_TaskSplitData.GatheredTrueUrlCount++; e_GUrlCount(this, new cGatherUrlCountArgs(m_TaskID, cGlobalParas.UpdateUrlCountType.UrlCountAdd, 0)); break; case (int)cGlobalParas.UrlGatherResult.Error: m_TaskSplitData.CurIndex++; m_TaskSplitData.GatheredErrUrlCount++; m_TaskSplitData.GatheredTrueErrUrlCount++; e_GUrlCount(this, new cGatherUrlCountArgs(m_TaskID, cGlobalParas.UpdateUrlCountType.ErrUrlCountAdd, 0)); break; case (int)cGlobalParas.UrlGatherResult.Gathered: m_TaskSplitData.CurIndex++; m_TaskSplitData.GatheredUrlCount++; m_TaskSplitData.GatheredTrueUrlCount++; e_GUrlCount(this, new cGatherUrlCountArgs(m_TaskID, cGlobalParas.UpdateUrlCountType.UrlCountAdd, 0)); break; } } else if (m_ThreadRunning == false) { //标示线程需要终止,退出for循环 break; } } //每采集完成一个网址需要判断当前线程是否已经结束 //需要判断已采集的网址和采集发生错误的网址 if (UrlCount == GatheredUrlCount + GatherErrUrlCount && UrlCount != GatherErrUrlCount) { ThreadState = cGlobalParas.GatherThreadState.Completed; } else if (UrlCount == GatherErrUrlCount) { //表示采集失败,但对于一个任务而言,一个线程的完全失败并不代表 //任务也采集完全失败,所以任务的安全失败需要到任务采集类中判断 //所以,在此还是返回线程任务完成时间,不是失败时间。 ThreadState = cGlobalParas.GatherThreadState.Completed; } else if (UrlCount < GatheredUrlCount + GatherErrUrlCount) { ThreadState = cGlobalParas.GatherThreadState.Completed; } else { ThreadState = cGlobalParas.GatherThreadState.Stopped; } m_ThreadRunning = false; }