repeated task执行(org-todo "DONE")不会记录状态变更日志之谜

在使用EmacsScript执行repeated task时,状态变为DONE后,通常会自动生成状态变更日志。然而,直接通过EmacsScript执行org-todo "DONE"操作会导致日志丢失。原因是org插入状态变更记录的流程依赖于某些条件,而在EmacsScript环境下未满足这些条件。解决方案是通过call-interactively手动触发相关函数。

原文地址:https://lujun9972.github.io/blog/2019/06/27/repeated-task执行(org-todo-"done")不会记录状态变更日志之谜/index.html

今天遇到一个很奇怪的情况,我们都知道当repeated task的state变成DONE时,是会自动将state变回原state, 同时会记录一条状态变更的日志。

比如,下面这个 t.org, screenshot-24.png 当执行了 (org-todo "DONE") 之后变成了 screenshot-25.png 其中的

- State "DONE"       from ""           [2019-06-27 四 20:49]

就是org自动生成的状态日志变更记录。

但是,若你以 EmacsScript 的形式执行 (org-todo "DONE") 时却发现状态变更日志不见了。

比如,我们创建一个测试文件 t.el,内容为

(find-file "t.org")
(org-todo "DONE")
(save-some-buffers t)
(save-buffers-kill-terminal)

然后执行

cat t.org
emacs --batch -l t.el
echo =======================================
sleep 60
cat t.org
emacs -q -l t.el
echo =======================================
cat t.org
* test
  SCHEDULED: <2019-06-27 四 +1d>
=======================================
* test
  SCHEDULED: <2019-06-28 五 +1d>
  :PROPERTIES:
  :LAST_REPEAT: [2019-06-27 四 21:07]
  :END:
=======================================
* test
  SCHEDULED: <2019-06-29 六 +1d>
  :PROPERTIES:
  :LAST_REPEAT: [2019-06-27 四 21:08]
  :END:

你会发现 SCHEDULEDLAST_REPEAT 都改变了,但是 - State "DONE" from "" [2019-06-27 四 20:49] 这样的状态变更日志不见了

经过查看 org.el 中的源代码,终于找到原因了。 org 插入状态变更记录的流程为:

  1. org-todo 调用 org-auto-repeat-maybe 函数
  2. org-auto-repeat-maybe 函数中通过 org-add-log-setuppost-command-hook 中设置 org-add-log-note 函数
  3. org-add-log-note 根据 org-log-note-how 的值(若为'time或'state)来调用 org-store-log-note
  4. org-store-log-note 中根据 org-log-note-headings 变量中定义的模板组装状态变更的日志(note变量)并插入repeated task中

这里主要的问题在于 org-add-log-note 是通过 post-command-hook 来触发的。而 post-command-hook 只有在 Command Loop 中才会被执行, 而在上面的例子中,我们在执行完elisp后直接通过 (save-buffers-kill-terminal) 退出了Emacs,根本没有时机触发 post-command-hook

解决方法是,手工通过 run-hooks 来运行 post-command-hook,比如将 t.el 改成

(find-file "t.org")
(org-todo "DONE")
(run-hooks 'post-command-hook)
(save-some-buffers t)
(save-buffers-kill-terminal)

再执行

cat t.org
emacs --batch -l t.el
echo =======================================
sleep 60
cat t.org
emacs -q -l t.el
echo =======================================
cat t.org
* test
  SCHEDULED: <2019-06-29 六 +1d>
  :PROPERTIES:
  :LAST_REPEAT: [2019-06-27 四 21:08]
  :END:
=======================================
* test
  SCHEDULED: <2019-06-30 日 +1d>
  :PROPERTIES:
  :LAST_REPEAT: [2019-06-27 四 21:36]
  :END:
  - State "DONE"       from ""           [2019-06-27 四 21:36]
=======================================
* test
  SCHEDULED: <2019-07-01 一 +1d>
  :PROPERTIES:
  :LAST_REPEAT: [2019-06-27 四 21:37]
  :END:
  - State "DONE"       from ""           [2019-06-27 四 21:37]
  - State "DONE"       from ""           [2019-06-27 四 21:36]

你会发现,状态变更记录现在正常出现了

private void OnExecuteCommand(Object sender) { #region 开始初始化监测 //TODO::lxw 调试注释 if (!Global.InitializeAutoDone) { ShowMessageBox("请先全部初始化!"); return; } if (Global.BasketContinueWork) { if (SelectedSlotFlow.FlowName != AnotherBasket.SelectedSlotFlow.FlowName) { ShowMessageBox("连续作业配方需一致!"); return; } } if (!Global.InitializeSystemDone || Helpering.IsInitializing) { ShowMessageBox("未初始化完成!"); return; } #endregion 开始初始化监测 //保存操作日志 GloBusiness.SaveOperationLog(View.Start.Content?.ToString()); #region 确认花篮状态 string id = "DI2.0"; switch (Basket) { case Constant.Basket1: id = SelectedMapSize.ComboCode == Global.Size6 ? "DI2.1" : "DI2.0"; Helpering.RunningSizeA = SelectedMapSize.ComboCode; break; case Constant.Basket2: id = SelectedMapSize.ComboCode == Global.Size6 ? "DI2.4" : "DI2.3"; Helpering.RunningSizeB = SelectedMapSize.ComboCode; break; } var port = Global.InputIOs.FirstOrDefault(i => i.RecId == id); if (!GloBusiness.CheckOn(port, 800)) { ShowMessageBox("请摆放新花篮后重新开始加工!"); return; } if (FlowerWorkStatusEnum == FlowerWorkStatusEnum.Finish) { ShowMessageBox("请摆放新花篮后重新开始加工!"); return; } #endregion 确认花篮状态 #region 确认工位状态、批配方、尺寸 if (!Global.Auto) { ShowMessageBox("请切换自动模式后重新开始加工!"); return; } if (SelectedSlotFlow == null) { ShowMessageBox("批配方为空不允许加工!"); return; } if (SelectedMapSize == null) { ShowMessageBox("尺寸选择为空不允许加工!"); return; } #endregion 确认工位状态、批配方、尺寸 //排放检测标志 var exhaustFlag = Global.Oems.FirstOrDefault(s => s.RecId == Constant.EXHAUST_CHECK_FLAG); foreach (var s in Global.CanNotStartWarning) { if ((s == "EQU_015" || s == "EQU_016" || s == "EQU_017" || s == "EQU_018") && exhaustFlag.SettingStatus == 0) { continue; } if (GlobalTimer.warningPool.ContainsKey(s) && GlobalTimer.warningPool[s]) { ShowMessageBox("当前设备有报警!"); return; } } //液罐状态 // var tankFlag = Global.Oems.FirstOrDefault(s => s.RecId == Constant.TANK_CHECK_FLAG); if (tankFlag.SettingStatus == 1 && !(LiquidExPbc.Tank2InGasIsOpen&&LiquidExPbc.Tank1InLqIsOpen) ||(LiquidExPbc.Tank2InGasIsOpen&& LiquidExPbc.Tank2InLqIsOpen)) // ( 1出液&&1进气 )||( 2出液&&2进气 ) { //ShowMessageBox("液罐供液异常,请确保有一个液罐在出液状态!"); //return; var result = ShowMessageBoxYesNo("液罐供液异常,请确保有一个液罐在出液状态!请确认是否继续加工!"); if (result == DialogState.Ok) { //MessageBox.Show("继续执行..."); } else if (result == DialogState.No) { //MessageBox.Show("操作已取消"); return; } } if ((string)sender != "button") { if (!timeClicked) { timeClicked = true; } else { if (clickThread != null) { clickThread.Abort(); clickThread = null; } timeClicked = true; clickThread = new Thread(new ThreadStart((Action)(() => { Thread.Sleep(100); timeClicked = false; }))); clickThread.IsBackground = true; clickThread.Start(); return; // 避免双击 } } clickThread = new Thread(new ThreadStart((Action)(() => { Thread.Sleep(100); timeClicked = false; }))); clickThread.IsBackground = true; clickThread.Start(); ProgressEnabled = false; SetRunning(!ProgressEnabled); NoticeBack(basketStatus); Setting.Save("Home", this.Basket + "MapSize", SelectedMapSize.RecId); Setting.Save("Home", this.Basket + "SlotFlow", SelectedSlotFlow.RecId); FlowerWorkStatusEnum = FlowerWorkStatusEnum.Prepare; Task.Run((() => RobotExecute.RemoveUnUseTask(Basket))); RobotExecute.Start(); Thread t = new Thread(() => { int CanNext = 0; StopClicked = false; TerminateClicked = false; Thread tr = new Thread(new ThreadStart((Action)(() => { try { if (Global.TwoBasketContinue) { if (Basket == Constant.Basket1) { while (Helpering.IsRunningB && !StopClicked && !TerminateClicked && GloBusiness.CheckOn(port, 300)) { Thread.Sleep(100); } } else if (Basket == Constant.Basket2) { while (Helpering.IsRunningA && !StopClicked && !TerminateClicked && GloBusiness.CheckOn(port, 300)) { Thread.Sleep(100); } } } basketStatus = Workflow.InitiateStations(SelectedSlotFlow, this.Basket); SlotStatues = basketStatus?.SlotStatues; ExecuteHelper.MonitorBasketWarning(basketStatus.StationCode, Basket, SelectedMapSize.ComboCode); if (StopClicked || TerminateClicked || !GloBusiness.CheckOn(port)) { CanNext = 1; ProgressEnabled = true; SetRunning(!ProgressEnabled); return; } //数据准备 foreach (string stationCode in basketStatus.StationCodes) { StationState stationState = Global.GetStationState(stationCode); if (!(stationState == StationState.Prepared || stationState == StationState.Maintenance || stationState == StationState.DoingFormula || stationState == StationState.WaitingTake)) { ShowMessageBox($"{stationCode}工位未初始化,请确认全部工位初始化后重新开始加工!"); CanNext = 1; ProgressEnabled = true; SetRunning(!ProgressEnabled); return; } } Message = "开始执行"; FlowerWorkStatusEnum = FlowerWorkStatusEnum.Working; basketStatus.ProductId = _productId; basketStatus.BatchNo = _batchNo; //SaveTask basketStatus.HardExecuteEntity = HardExecuteDA.Save(ExecuteConvert.ConvertExecuteMain(basketStatus)); Global.DebugBasketStatus = basketStatus; basketStatus.ExceptionMessage = string.Empty; basketStatus.Basket = Basket; basketStatus.Canceling = false; basketStatus.LittleName = string.Format("[{0}]", Basket == Constant.Basket1 ? Constant.LittleAName : Constant.LittleBName); basketStatus.StationCode = string.Format("{0}", Basket == Constant.Basket1 ? Constant.BasketCode1 : Constant.BasketCode2); basketStatus.Size = SelectedMapSize.RecId; //加载花篮后再执行 //Global.GetDefaultPR(); //CS1_001,CS2_001,花篮异常, 和花篮尺寸匹对相当于double check ExecuteHelper.MonitorBasketWarning(basketStatus.StationCode, basketStatus.Basket, SelectedMapSize.ComboCode); if (ExecuteHelper.CheckBasketWarning(basketStatus.StationCode, basketStatus.Basket, SelectedMapSize.RecId) && Global.IsRelease) { CanNext = 1; ProgressEnabled = true; SetRunning(!ProgressEnabled); FlowerWorkStatusEnum = FlowerWorkStatusEnum.None; return; } //CS1_002,CS2_002,晶圆异常 //TODO xj 临时屏蔽 //if (ExecuteHelper.CheckDiskWarning(basketStatus.StationCode, true) && Global.IsRelease) //{ // CanNext = 1; // ProgressEnabled = true; // SetRunning(!ProgressEnabled); // FlowerWorkStatusEnum = FlowerWorkStatusEnum.None; // ShowErrorBox(string.Format("[{0}-WRN]晶圆片异常!", basketStatus.StationCode)); // return; //} // 下发配方 WorkflowPreTask.PreRun(SelectedSlotFlow); Thread.Sleep(1000); //TODO::lxw 调试注释 while (!StopClicked && !TerminateClicked && GloBusiness.CheckOn(port, 300)) { if (ExeBaseHelper.DtmCheck()) { break; } Thread.Sleep(300); } if (StopClicked || TerminateClicked || !GloBusiness.CheckOn(port)) { CanNext = 1; ProgressEnabled = true; SetRunning(!ProgressEnabled); return; } //Robot Mapping Speed var setting = Global.Settings.FirstOrDefault(q => q.RecId == "Robot_MappingSpeed"); var command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.SSPP); string callback = Robot.Send(string.Format("{0} {1},{2},{2},{2},{2}", command.CommandCode, command.CommandParam, setting.SettingValue)); if (callback != ">") { CanNext = 1; ProgressEnabled = true; SetRunning(!ProgressEnabled); FlowerWorkStatusEnum = FlowerWorkStatusEnum.None; ShowErrorBox(string.Format("设置Map速度失败!")); return; } //开关真空检测 command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.SRTF); string commandText = string.Format("{0} {1}", command.CommandCode, command.CommandParam); callback = Robot.Send(commandText); if (callback != ">") { CanNext = 1; ProgressEnabled = true; SetRunning(!ProgressEnabled); FlowerWorkStatusEnum = FlowerWorkStatusEnum.None; ShowErrorBox(string.Format("开关真空检测失败!")); return; } //略感測器之訊號 setting = Global.Settings.FirstOrDefault(q => q.RecId == "Robot_ArmRVacuumCheck"); //Robot_ArmLVacuumCheck if (setting != null) { command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.SSEN); commandText = string.Format("{0} {1}", command.CommandCode, setting.SettingStatus == 1 ? 0 : 1); callback = Robot.Send(commandText); if (callback != ">") { CanNext = 1; ProgressEnabled = true; SetRunning(!ProgressEnabled); FlowerWorkStatusEnum = FlowerWorkStatusEnum.None; ShowErrorBox(string.Format("略感測器之訊號!")); return; } } string scanValue = ""; //复用 if (IsRepeated != null && IsRepeated.Code) { var hardScanSlotRecordEntity = HardScanSlotRecordDA.QueryLatestOne(basketStatus.Basket); scanValue = hardScanSlotRecordEntity.Value; } else { //等待机器人 while (Robot.RobotState == RobotState.Run) { Thread.Sleep(500); } if (Global.Mock) { scanValue = "111111111111111111111111111"; } else { //扫片 DtStart = DateTime.Now; Robot.RobotState = RobotState.Run; string a = ""; if (Basket == Constant.Basket1) { if (basketStatus.Size == Global.Size6) { a = "c"; } else { a = "a"; } } else if (Basket == Constant.Basket2) { if (basketStatus.Size == Global.Size6) { a = "e"; } else { a = "b"; } } command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.MAP); commandText = $"{command.CommandCode} {a}"; // commandText = $"{command.CommandCode} {(Basket == Constant.Basket1 ? "a" : "b")}"; callback = Robot.Send(commandText); if (callback != ">") { ExecuteRobotHelper.CheckRobotWarning(true, ""); CanNext = 1; ProgressEnabled = true; FlowerWorkStatusEnum = FlowerWorkStatusEnum.None; Robot.RobotState = RobotState.Idle; ShowErrorBox(string.Format("运行Map失败")); return; } TsNow = DateTime.Now - DtStart; double tt1 = TsNow.TotalMilliseconds; command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.RSR); commandText = $"{command.CommandCode}"; scanValue = Robot.Send(commandText); Robot.RobotState = RobotState.Idle; Log.Info($"scan {scanValue}"); //scanValue = "000011111111111111111111111"; } } HardScanSlotRecordDA.Save(ExecuteConvert.ConvertScanSlotRecord(basketStatus, scanValue)); //扫片结果 Robot.AnalyzeScanWafer(scanValue, basketStatus.SlotStatues); SlotStatues = basketStatus?.SlotStatues; TsNow = DateTime.Now - DtStart; double tt2 = TsNow.TotalMilliseconds; #region 扫片异常处理现代码 //CS1_002,CS2_002,晶圆异常 var firstError = basketStatus.SlotStatues.FirstOrDefault(q => q.InStatus > 1); if (firstError != null || !basketStatus.SlotStatues.Any(q => q.InBasketStatus == SlotInBasketStatus.Exist)) { //异常后人工处理 WorkChooseScanningAnomalyViewModule lvm = new WorkChooseScanningAnomalyViewModule(); lvm.ShowDialog(scanValue); scanValue = Global.ScanningValue; //再次处理扫片结果 Robot.AnalyzeScanWafer(scanValue, basketStatus.SlotStatues); SlotStatues = basketStatus?.SlotStatues; //Robot AutoRunSpeed 连续作业再次设设置机器人速度 if (Global.BasketContinueWork) { setting = Global.Settings.FirstOrDefault(q => q.RecId == "Robot_AutoRunSpeed"); command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.SSPP); callback = Robot.Send(string.Format("{0} {1},{2},{2},{2},{2}", command.CommandCode, command.CommandParam, setting.SettingValue)); if (callback != ">") { CanNext = 1; ShowErrorBox(string.Format("设置机器人配方运行速度失败")); return; } } } #endregion #region 扫片异常处理原代码 //CS1_002,CS2_002,晶圆异常 // var firstError = basketStatus.SlotStatues.FirstOrDefault(q => q.InStatus > 1); // if (firstError != null || // !basketStatus.SlotStatues.Any(q => q.InBasketStatus == SlotInBasketStatus.Exist)) // { // // //扫片异常 // var warning = // Global.Warnings.FirstOrDefault(q => q.WarningCode == basketStatus.StationCode + "_003"); // if (warning != null) // { // SysWarningEntity swe = new SysWarningEntity(); // swe.WarnCode = warning.WarningCode; // swe.WarnName = warning.WarningCode; // swe.LogDetail = string.Format(Constant.DefaultWarningCode, warning.WarningCode, // warning.WarningName); // swe.StartTime = DateTime.Now; // swe.CreateBy = Global.CurrentUserCode; // swe.LogType = warning.ActionType; //告警等级 // swe.RefWarn = warning.RecId; // SysWarningDA.Save(swe); // } // // CanNext = 1; // ProgressEnabled = true; // SetRunning(!ProgressEnabled); // FlowerWorkStatusEnum = FlowerWorkStatusEnum.None; // ShowErrorBox( // "扫片异常,请检查花篮晶圆摆放!"); // string.Format(, basketStatus.StationCode, firstError?.Index, firstError?.StatusMessage)); // SetWoringEndState(); // // //Robot AutoRunSpeed 连续作业再次设设置机器人速度 // if (Global.BasketContinueWork) // { // setting = Global.Settings.FirstOrDefault(q => q.RecId == "Robot_AutoRunSpeed"); // command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.SSPP); // callback = Robot.Send(string.Format("{0} {1},{2},{2},{2},{2}", command.CommandCode, // command.CommandParam, setting.SettingValue)); // if (callback != ">") // { // CanNext = 1; // ShowErrorBox(string.Format("设置机器人配方运行速度失败")); // return; // } // } // // return; // } // else //恢复状态 // { // HardWarningEntity warning = // Global.Warnings.FirstOrDefault(q => q.WarningCode == basketStatus.StationCode + "_003"); // if (warning != null) // { // //查找最近的告警,如存在则更新状态 // string recid = SysWarningDA.LoadLastWarning(warning.RecId); // if (!string.IsNullOrWhiteSpace(recid)) // { // SysWarningDA.RefreshEndTime(recid); // } // } // } #endregion //根据选择过滤 List<string> filter = basketStatus.StationCode == Constant.BasketCode1 ? Global.CS1WorkState : Global.CS2WorkState; basketStatus.SlotStatues.ForEach(s => s.IsSelected = filter[s.Index - 1] == "ON"); TsNow = DateTime.Now - DtStart; double tt3 = TsNow.TotalMilliseconds; //Robot AutoRunSpeed setting = Global.Settings.FirstOrDefault(q => q.RecId == "Robot_AutoRunSpeed"); command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.SSPP); callback = Robot.Send(string.Format("{0} {1},{2},{2},{2},{2}", command.CommandCode, command.CommandParam, setting.SettingValue)); if (callback != ">") { CanNext = 1; ProgressEnabled = true; SetRunning(!ProgressEnabled); FlowerWorkStatusEnum = FlowerWorkStatusEnum.None; ShowErrorBox(string.Format("设置机器人配方运行速度失败")); return; } TsNow = DateTime.Now - DtStart; check1 = TsNow.TotalMilliseconds; ProgressEnabled = false; CanNext = 2; } catch (Exception ex) { FlowerWorkStatusEnum = FlowerWorkStatusEnum.None; ShowErrorBox(ex.Message); CanNext = 1; } }))); tr.IsBackground = true; tr.Name = $"ScanThread:{GloBusiness.CreateRandom()}"; tr.Start(); //等待信息返回 while (CanNext == 0) { Helpering.Sleep(30); } TsNow = DateTime.Now - DtStart; check2 = TsNow.TotalMilliseconds; if (CanNext == 2) { ProgressEnabled = false; NoticeBack(basketStatus); cancellationTokenSource = new CancellationTokenSource(); RobotExecute.RemoveDoneTask(this.basketStatus.BasketCode); DebugLog.WriteLog("create main task"); RobotScanResult robotScanResult = new RobotScanResult(); if (basketStatus.StationCode == Constant.BasketCode1) { Global.BasketAStatus = basketStatus; } else { Global.BasketBStatus = basketStatus; } robotScanResult.BasketCode = basketStatus.StationCode; robotScanResult.Slots = basketStatus.SlotStatues; AppEventAggregator.GetEventAggregator().GetEvent<RobotScanResultEvent>().Publish(robotScanResult); Task flowTask = new Task(() => { try { Thread.CurrentThread.Name = $"basket {basketStatus.StationCode} thread"; //TODO 一开始把所有的花篮拿的任务都放到机器人队列里 string key = basketStatus.StationCode; if (basketStatus.Size != Global.Size6) { key = key + "-4"; } HardRobotStationEntity basket = Global.RobotStations.FirstOrDefault(q => q.StationCode == key); foreach (SlotStatus slotStatus in basketStatus.SlotStatues.Where(s => s.InStatus == 1 && s.Status == ExecuteStatusEnum.Prepare && s.IsSelected)) { StationStatus stationStatus = new StationStatus() { BasketStatus = basketStatus, SlotStatus = slotStatus, StationCode = basketStatus.StationCode, SlotStepStatus = new SlotStepStatus() { BasketStatus = basketStatus, IsLastStep = false, StationType = StationTypeEnum.CS, NextType = StationTypeEnum.CA, NextSlotStepStatus = slotStatus.SlotStepStatues[0], SlotStatus = slotStatus, Status = ExecuteStatusEnum.Wait, Index = 0 } }; slotStatus.SlotStepStatues[0].PreviousSlotStepStatus = stationStatus.SlotStepStatus; FlowStatus flowStatus = new FlowStatus() { StationStatus = stationStatus, BasketStatus = basketStatus, SlotStepStatus = stationStatus.SlotStepStatus, SlotStatus = slotStatus, }; RobotTask task = new RobotTask() { Priority = 9, TaskId = Guid.NewGuid().ToString(), Status = TaskStatus.Puted, PutType = TaskType.Get, RobotStation = basket, StationStatus = stationStatus, FlowStatus = flowStatus, CancellationTokenSource = cancellationTokenSource }; RobotExecute.Push(task); } RobotExecute.Start(); //开启机器人任务调度 TsNow = DateTime.Now - DtStart; check3 = TsNow.TotalMilliseconds; //解除暂停 foreach (var stationCode in basketStatus.StationCodes) { Global.ClearPauseState(stationCode); Global.ClearAbortState(stationCode); } workflowTask = new WorkflowTask(); SetWorkflowStatus(); //登记开始加工日志 SysLogEntity sle = new SysLogEntity(); sle.LogType = (int)LogType.FlowStart; sle.LogStatus = (int)LogStatus.Start; sle.Basket = Basket; sle.BatchNo = BatchNo; sle.ProductId = ProductId; sle.WorkflowId = basketStatus.WorkflowId; sle.FlowId = basketStatus.FlowId; sle.LogCode = basketStatus.SelectedSlotFlow.FlowCode; sle.LogName = basketStatus.SelectedSlotFlow.FlowName; sle.Pieces = basketStatus.SlotStatues.Count(q => q.Status == ExecuteStatusEnum.Done && q.SlotStepStatues.Count > 0); sle.LogDetail = string.Format("花篮:{0}开始加工", Basket); sle.StartTime = DateTime.Now; sle.CreateBy = Global.CurrentUser.UserName; SysLogDA.Save(sle); basketStatus.Canceling = false; DebugLog.WriteLog("execute main task"); if (!StopClicked && !TerminateClicked) { Helpering.IsRunning = true; //同步运行状态 if (Basket == Constant.Basket1) { Helpering.RunningSizeA = SelectedMapSize.ComboCode; } else { Helpering.RunningSizeB = SelectedMapSize.ComboCode; } //清空告警信息 if (basketStatus.StationCode == Constant.BasketCode1) { Global.AllowBasketABeep = false; } else { Global.AllowBasketBBeep = false; } // workflowTask.Prepare(basketStatus); TsNow = DateTime.Now - DtStart; check4 = TsNow.TotalMilliseconds; basketStatus.HardExecuteEntity.Status = 1; HardExecuteDA.Update(basketStatus.HardExecuteEntity); //作业任务 workflowTask.Execute(cancellationTokenSource, basketStatus); } StopClicked = false; TerminateClicked = false; ProgressEnabled = true; SetRunning(!ProgressEnabled); NoticeBack(basketStatus); //timer.Stop(); if (cancellationTokenSource.IsCancellationRequested) { Message = "手工终止!"; FlowerWorkStatusEnum = FlowerWorkStatusEnum.None; IsFinisingState = false; basketStatus.HardExecuteEntity.Status = 3; } else { SetWoringEndState(); } HardExecuteDA.Update(basketStatus.HardExecuteEntity); UpdateWorkingLog(); workflowTask = null; } catch (Exception ex) { Log.Info($"flow task error{ex}"); workflowTask = null; if (!cancellationTokenSource.IsCancellationRequested) //等待取片 { ProgressEnabled = true; SetRunning(!ProgressEnabled); } Message = ex.Message; FlowerWorkStatusEnum = FlowerWorkStatusEnum.None; IsFinisingState = false; NoticeBack(basketStatus); } Task.Run((() => RobotExecute.RemoveUnUseTask(Basket))); Log.Info("flow task finished"); }, cancellationTokenSource.Token, TaskCreationOptions.LongRunning); flowTask.Start(); } }); t.Name = $"BasketWorkingThread:{GloBusiness.CreateRandom()}"; t.Start(); } 我是在这个方法里这里//异常后人工处理 WorkChooseScanningAnomalyViewModule lvm = new WorkChooseScanningAnomalyViewModule(); lvm.ShowDialog(scanValue); scanValue = Global.ScanningValue;调用的,出现刚才的错误,怎么修改
最新发布
09-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值