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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top