Fluxo de Trabalho 4.0 atividade personalizada para iniciar o processo externo
-
18-09-2019 - |
Pergunta
Eu estou tentando sair de Workflow 4.0 e esperando para escrever uma actividade personalizada para iniciar um executável externo, espera para que esse processo completo e, em seguida, retomar a passos subsequentes no fluxo de trabalho.
Eu encontrei o seguinte exemplo que mostra (na parte inferior da página) como escrever uma atividade a espera de um arquivo para chegar em um diretório específico:
Criando atividades personalizadas com o Workflow 4.0
Eu tenho um par de problemas com o exemplo. Em primeiro lugar, quando eu adicione o seguinte código:
void FileCreated(object sender, FileSystemEventArgs e)
{
instance.ResumeBookmark(bookmarkName, e.FullPath);
fsw.Dispose();
}
instance.Resumebookmark(...)
não parece estar disponível, mas instance.BeginResumeBookmark
e instance.EndResumeBookmark
são.
Eu também tenho certeza de como mudar isso em torno de lidar com processos externos, em vez de apenas assistir o conteúdo de um diretório.
É isso mesmo a melhor abordagem para este tipo de coisa?
Solução
Eu sugeriria escrevendo um AyncCodeActivity e evitar marcadores completamente. Aqui está um exemplo de uma atividade personalizada que retorna o código de saída do processo como o resultado:
public sealed class RunProcess : AsyncCodeActivity<int>
{
public InArgument<string> FileName { get; set; }
public InArgument<string> Arguments { get; set; }
private Func<string, string, int> runProcessAsyncCall;
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
{
this.runProcessAsyncCall = this.RunProcessImpl;
return runProcessAsyncCall.BeginInvoke(FileName.Get(context), Arguments.Get(context), callback, state);
}
protected override int EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
{
return this.runProcessAsyncCall.EndInvoke(result);
}
private int RunProcessImpl(string fileName, string arguments)
{
Process p = Process.Start(fileName, arguments);
p.WaitForExit();
return p.ExitCode;
}
}
Em geral, os marcadores são grandes, se o evento externo não virá para uma potencialmente muito tempo. Se o processo que você está invocando é de curta duração, uma AsyncCodeActivity pode ser uma escolha melhor (é certamente um mais fácil de gerir).
Outras dicas
Esta abordagem funciona perfeitamente bem para a execução de outros processos. Use o Process.WaitForExit para verificar quando o processo é feito, opcionalmente verificar o ExitCode , e retomar o marcador.