// 顺序任务 回退当前任务之前所有任务 internal static async Task Excuting_SerialRevert <TTData, TTRes>(this BaseNode <TTData, TTRes> node, TTData data, NodeResp <TTRes> nodeResp, IList <IEventTask <TTData> > tasks, string blockTaskId, int triedTimes) where TTData : class where TTRes : Resp, new() { if (nodeResp.RevrtTasks == null) { nodeResp.RevrtTasks = new List <TaskMeta>(tasks.Count); } foreach (var tItem in tasks) { if (tItem.TaskMeta.task_id == blockTaskId) { nodeResp.RevrtTasks.Add(tItem.TaskMeta); break; } var rRes = await ExecutorUtil.TryRevertTask(tItem, data, triedTimes);// tItem.Revert(data); if (rRes) { nodeResp.RevrtTasks.Add(tItem.TaskMeta); } } }
// 并行任务回退处理(回退当前其他所有任务) internal static async Task Excuting_ParallelRevert <TTData, TTRes>(this BaseNode <TTData, TTRes> node, TTData data, NodeResp <TTRes> nodeResp, IList <IEventTask <TTData> > tasks, string blockTaskId, int triedTimes) where TTData : class where TTRes : Resp, new() { var revResList = tasks.Select(tItem => tItem.TaskMeta.task_id == blockTaskId ? Task.FromResult(true) : ExecutorUtil.TryRevertTask(tItem, data, triedTimes)) .ToArray(); try { await Task.WhenAll(revResList); } catch (Exception ex) { LogUtil.Error($"An error occurred while the parallel node reverted all tasks. Detail:{ex}", node.NodeMeta.node_id, EventTaskProvider.ModuleName); } if (nodeResp.RevrtTasks == null) { nodeResp.RevrtTasks = new List <TaskMeta>(tasks.Count); } for (var i = 0; i < tasks.Count; i++) { var res = false; var resT = revResList[i]; if (resT.Status == TaskStatus.RanToCompletion) { res = resT.Result; } if (res) { nodeResp.RevrtTasks.Add(tasks[i].TaskMeta); } } }