/// <summary> /// 开始执行任务 /// </summary> /// <param name="isLastNodeCase">是否为程序上次运行添加的节点实例,这种节点可能正处于运行中程序被停止了</param> /// <returns></returns> public bool Start(bool isLastNodeCase = false) { try { //验证运行节点实例数量 if (Main.RunningNodeCount >= Main.MaxExecuteNodeCount) { WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("当前已经有【{0}】个节点实例运行,超过系统设定的最大数【{1}】,本节点实例将暂时不被执行。", Main.RunningNodeCount, Main.MaxExecuteNodeCount)); return(false); } //读取当前节点 _nodeCaseEntity = BLL.EM_SCRIPT_NODE_CASE.Instance.GetEntityByKey <BLL.EM_SCRIPT_NODE_CASE.Entity>(_scriptNodeCaseID); if (_nodeCaseEntity == null) { WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("没有获取脚本流节点实例ID【{0}】的实体对象,将不被执行。", _scriptNodeCaseID)); return(false); } //已经停止的节点,不再执行 if (_nodeCaseEntity.RUN_STATUS == (short)Enums.RunStatus.Stop) { WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("脚本流【{0}】的实例【{1}】中的节点【{2}】的实例【{3}】的运行状态为【停止】,本节点将不被执行。", _nodeCaseEntity.SCRIPT_ID, _nodeCaseEntity.SCRIPT_CASE_ID, _nodeCaseEntity.SCRIPT_NODE_ID, _nodeCaseEntity.ID)); return(false); } //当前状态不等于等待执行 if (_nodeCaseEntity.RUN_STATUS != (short)Enums.RunStatus.Wait) { //上次未完成的节点实例,可以继续执行 if (isLastNodeCase == false) { WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("脚本流【{0}】的实例【{1}】中的节点【{2}】的实例【{3}】的运行状态不为【等待执行】,本节点将不被执行。", _nodeCaseEntity.SCRIPT_ID, _nodeCaseEntity.SCRIPT_CASE_ID, _nodeCaseEntity.SCRIPT_NODE_ID, _nodeCaseEntity.ID)); return(false); } } //添加到内存 if (Main.AddNodeTask(_scriptNodeCaseID) == false) { //WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("脚本流【{0}】的实例【{1}】中的节点【{2}】的实例【{3}】已经于【{4}】开始运行,本次将不被执行。", _nodeCaseEntity.SCRIPT_ID, _nodeCaseEntity.SCRIPT_CASE_ID, _nodeCaseEntity.SCRIPT_NODE_ID, _nodeCaseEntity.ID, Main.GetNodeTaskStartTime(_scriptNodeCaseID).ToString("yyyy-MM-dd HH:mm:ss.fff"))); return(false); } //更新当前节点状态 int i = BLL.EM_SCRIPT_NODE_CASE.Instance.UpdateRunStatus(_scriptNodeCaseID, Enums.RunStatus.Excute); if (i < 0) { WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("更新脚本流【{0}】的实例【{1}】中的节点【{2}】的实例【{3}】的运行状态为【执行中】失败,本节点将不被执行。", _nodeCaseEntity.SCRIPT_ID, _nodeCaseEntity.SCRIPT_CASE_ID, _nodeCaseEntity.SCRIPT_NODE_ID, _nodeCaseEntity.ID)); return(false); } WriteLog(_scriptNodeCaseID, BLog.LogLevel.INFO, string.Format("脚本流【{0}】的实例【{1}】中的节点【{2}】的实例【{3}】的运行状态已经更新为【执行中】,下面将执行节点脚本内容。", _nodeCaseEntity.SCRIPT_ID, _nodeCaseEntity.SCRIPT_CASE_ID, _nodeCaseEntity.SCRIPT_NODE_ID, _nodeCaseEntity.ID)); _bw = new BackgroundWorker(); _bw.WorkerSupportsCancellation = true; _bw.DoWork += DoWork; _bw.RunWorkerAsync(); } catch (Exception ex) { WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("执行节点实例【{0}】出现了未知异常,1错误信息为:\r\n{1}", _scriptNodeCaseID, ex.ToString())); return(false); } return(true); }