public IDecorationCommandImplementation Get(IProcessCommand command) { if (command is IRunCommand) return new RunCommand(command as IRunCommand); throw new ArgumentException(); }
public CommandResultProcessor NotifyProcessCommandSendFailed(IProcessCommand command) { TaskCompletionSource<ProcessResult> taskCompletionSource; if (_processTaskDict.TryGetValue(command.ProcessId, out taskCompletionSource)) { taskCompletionSource.TrySetResult(new ProcessResult(command.ProcessId, 0, "Start process command send failed.")); } return this; }
/// <summary> /// 指定されたコマンドを実行します。 /// </summary> /// <param name="command">コマンド</param> /// <param name="prevExitCode">前処理の終了コード</param> /// <returns></returns> protected async Task <int> ExecuteCommandAsync(IProcessCommand command, int prevExitCode) { try { await foreach (string item in command.StartAsync(prevExitCode)) { Console.WriteLine($"[{command.Name}] {item}"); } return(0); } catch (ProcessErrorException ex) { Console.WriteLine(ex.Message); return(ex.ExitCode); } }
public async Task SetCommand(IProcessCommand command) { logger.Log("Process " + Id + " sending property command for " + command.GetKey() + ":" + command.GetShortStatus()); IComputer remote; Task computerInterrupt; lock (this) { // use a lock to ensure memory safety since these are set on another thread remote = computer; computerInterrupt = computerCancellation; } Task interrupt = Task.WhenAny(computerInterrupt, AsyncCancelTask); StringBuilder sb = new StringBuilder(directory); sb.AppendFormat("?op=setstatus"); sb.AppendFormat("&key={0}", command.GetKey()); sb.AppendFormat("&shortstatus={0}", command.GetShortStatus()); sb.AppendFormat("¬ifywaiters=true"); Task <string> bail = interrupt.ContinueWith((t) => ""); Task <string> upload = PostRequest(remote, sb.ToString(), command.GetPayload()); Task <string> completed = await Task.WhenAny(bail, upload); if (completed == bail) { logger.Log("Process " + Id + " abandoned property command due to interrupt"); return; } if (completed.Result == null) { logger.Log("Process " + Id + " send property command succeeded"); command.OnCompleted(null); } else { // if this failed, there's nothing much more we can do logger.Log("Process " + Id + " got command send failure " + completed.Result); command.OnCompleted(completed.Result); } }
public IDecorationCommandImplementation Get(IProcessCommand command) { if (command is IRunCommand) { return(new RunCommand(command as IRunCommand)); } if (command is IKillCommand) { return(new KillCommand(command as IKillCommand)); } if (command is IWaitCommand) { return(new WaitCommand(command as IWaitCommand)); } throw new ArgumentException(); }
/// <summary> /// 处理操作 /// </summary> /// <param name="request">请求参数</param> /// <param name="ctx">上下文参数</param> /// <returns>返回处理结果</returns> public virtual INGPResponse HandleProcess(INGPRequest request, TContext ctx) { INGPResponse result = null; do { // 当前执行结果 result = Process(request, ctx); IProcessCommand <TContext> step = null; if (!_steps.TryDequeue(out step) || step == null) { break; } var nextRequest = result as INGPRequest; step.HandleProcess(nextRequest, ctx); }while (_steps.Count > 0); return(result); }
public override async Task Execute() { IProcessCommand processor = null; if (IsImage()) { processor = new ProcessImage { Source = Source, CurrentUser = CurrentUser, LoadType = "File Upload", CloudHandler = CloudHandler, DataHandler = DataHandler }; } else if (IsVideo()) { } else if (IsDocument()) { } if (processor != null) { await LogicHandler.Execute(processor); if (processor.Result != null && processor.Result.Success) { Model = processor.Result.Value as VisibleFile; Result = processor.Result; } else { Result = ActionConfirm.CreateFailure("File " + Source.FileName + " -> failed to load"); } } else { Result = ActionConfirm.CreateFailure("File " + Source.FileName + " -> type not supported"); } }
public ProcessSubcommand(IProcessCommand adapted_command) : base(adapted_command) { this.adapted_command = adapted_command; }
public ProcessSubcommand() { adapted_command = new ProcessCommandAdapter(this); }
public Task<ProcessResult> StartProcess(IProcessCommand command) { var message = BuildCommandMessage(command); var taskCompletionSource = new TaskCompletionSource<ProcessResult>(); _commandResultProcessor.RegisterProcess(command, taskCompletionSource); _producer.SendAsync(message, command.AggregateRootId).ContinueWith(sendTask => { if (sendTask.Result.SendStatus == SendStatus.Failed) { _commandResultProcessor.NotifyProcessCommandSendFailed(command); } }); return taskCompletionSource.Task; }
/// <summary> /// インスタンスを生成します。 /// </summary> /// <param name="command">コマンド</param> /// <param name="exitCode">終了コード</param> public ProcessCommandResult(IProcessCommand command, int exitCode) { Command = command; ExitCode = exitCode; }
public void SetProcessCommand(IProcess ip, IProcessCommand command) { Process process = ip as Process; Task.Run(() => process.SetCommand(command)); }
/// <summary> /// 添加下一步骤 /// </summary> /// <param name="step">下一步骤</param> public void AddNextStep(IProcessCommand <TContext> step) { // 添加元素 _steps.Enqueue(step); }
/// <summary> /// インスタンスを生成します。 /// </summary> /// <param name="id">ID</param> /// <param name="name">名称</param> /// <param name="command">コマンド</param> public WorkflowItem(string id, string name, IProcessCommand command) : base(id, name) { Command = command; }
public Task<ProcessResult> StartProcess(IProcessCommand command) { throw new NotImplementedException(); }
public async Task SetCommand(IProcessCommand command) { logger.Log("Process " + Id + " sending property command for " + command.GetKey() + ":" + command.GetShortStatus()); IComputer remote; Task computerInterrupt; lock (this) { // use a lock to ensure memory safety since these are set on another thread remote = computer; computerInterrupt = computerCancellation; } Task interrupt = Task.WhenAny(computerInterrupt, AsyncCancelTask); StringBuilder sb = new StringBuilder(directory); sb.AppendFormat("?op=setstatus"); sb.AppendFormat("&key={0}", command.GetKey()); sb.AppendFormat("&shortstatus={0}", command.GetShortStatus()); sb.AppendFormat("¬ifywaiters=true"); Task<string> bail = interrupt.ContinueWith((t) => ""); Task<string> upload = PostRequest(remote, sb.ToString(), command.GetPayload()); Task<string> completed = await Task.WhenAny(bail, upload); if (completed == bail) { logger.Log("Process " + Id + " abandoned property command due to interrupt"); return; } if (completed.Result == null) { logger.Log("Process " + Id + " send property command succeeded"); command.OnCompleted(null); } else { // if this failed, there's nothing much more we can do logger.Log("Process " + Id + " got command send failure " + completed.Result); command.OnCompleted(completed.Result); } }
public NESEngine(IProcessCommand commandProcessor, IOManager consoleManager, IPrinterManager printerManager) { CommandProcessor = commandProcessor; ConsoleManager = consoleManager; PrinterManager = printerManager; }
public CommandResultProcessor RegisterProcess(IProcessCommand command, TaskCompletionSource<ProcessResult> taskCompletionSource) { _processTaskDict.TryAdd(command.ProcessId, taskCompletionSource); return this; }