public IActionFutureSet createSet() { IActionFutureSet afs = new ActionFutureSet(); afs.addAction(this); return(afs); }
private bool Terminate(SWLWorkflowIterate <bool> node) { if (node.exit_clause == null && node.enter_clause == null) { return(false); } Console.WriteLine("TERMINATE 1"); IActionFutureSet fs = new ActionFutureSet(); IActionFuture[] future_list = new IActionFuture[node.exit_clause.Length]; string[] enter_action_list = new string[node.exit_clause.Length]; string[] exit_action_list = new string[node.exit_clause.Length]; for (int i = 0; i < node.exit_clause.Length; i++) { Console.WriteLine("TERMINATE 2 {0}", i); string exit_action = node.exit_clause[i].action; string exit_port = node.exit_clause[i].id_port; string enter_action = node.enter_clause[i].action; string enter_port = node.enter_clause[i].id_port; Console.WriteLine("TERMINATE 3 {0} / {1}.{2} -- {3}.{4}", i, exit_port, exit_action, enter_port, enter_action); // It is supposed that both exit and enter action ports are the same; ITaskBindingKind action_port_exit = port(exit_port); ITaskBindingKind action_port_enter = port(enter_port); Debug.Assert(action_port_exit == action_port_enter, "ITERATION: EXIT and ENTER action ports are distinct ! Check !"); Console.WriteLine("TERMINATE 4 {0} {1}", action_port_exit == null, action_port_enter == null); IActionFuture f; action_port_enter.invoke(new string[2] { exit_action, enter_action }, out f); fs.addAction(f); Console.WriteLine("TERMINATE 5 {0}", i); future_list[i] = f; enter_action_list[i] = enter_action; exit_action_list[i] = exit_action; } Console.WriteLine("TERMINATE 6 -- BEFORE WAIT ALL"); fs.waitAll(); Console.WriteLine("TERMINATE 7 -- AFTER WAIT ALL"); int end_iteration = 0; //unknown=0; enter=1; exit=2 for (int i = 0; i < future_list.Length; i++) { string action_result = (string)future_list[i].Action; Console.WriteLine("TERMINATE 8 i={0} -- result={1}", i, action_result); if (action_result.Equals(enter_action_list[i]) && end_iteration == 0) { end_iteration = 1; } else if (action_result.Equals(exit_action_list[i]) && end_iteration == 0) { end_iteration = 2; } else if (action_result.Equals(enter_action_list[i]) && end_iteration == 2) { throw new Exception("ITERATE: Conflict in termination clause !"); } else if (action_result.Equals(exit_action_list[i]) && end_iteration == 1) { throw new Exception("ITERATE: Conflict in termination clause !"); } Console.WriteLine("TERMINATE 9 i={0} -- end_iteration={1}", i, end_iteration); } return(end_iteration == 2); }