Pregunta

Estoy probando Workflow 4.0 y con la esperanza de escribir una actividad personalizada para iniciar un ejecutable externo, esperar a que el proceso se complete, y luego retomar los pasos posteriores en el flujo de trabajo.

He encontrado el siguiente ejemplo que muestra (hacia la parte inferior de la página) Cómo escribir una actividad a la espera de un archivo para llegar a un directorio específico:

Creación de actividades personalizadas de flujo de trabajo con 4.0

Tengo un par de problemas con el ejemplo. En primer lugar, cuando agrego el siguiente código:

void FileCreated(object sender, FileSystemEventArgs e)
{
    instance.ResumeBookmark(bookmarkName, e.FullPath);
    fsw.Dispose();
}

instance.Resumebookmark(...) no parece estar disponible, pero instance.BeginResumeBookmark y instance.EndResumeBookmark son.

También estoy seguro de cómo cambiar esta alrededor para hacer frente a los procesos externos, en lugar de sólo ver el contenido de un directorio.

¿Es esto el mejor enfoque para este tipo de cosas?

¿Fue útil?

Solución

Yo sugeriría escribir un AyncCodeActivity marcadores y evitar por completo. Aquí está un ejemplo de una actividad personalizada que devuelve el código de salida del proceso como el 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;
        }
    }

En general, los marcadores son grandes si el evento externo no vendrá para un potencial mucho tiempo. Si el proceso que está invocando es de corta duración, un AsyncCodeActivity podría ser una mejor opción (que es sin duda uno más fácil de manejar).

Otros consejos

Este enfoque funciona perfectamente bien para ejecutar otros procesos. Utilice la Process.WaitForExit para comprobar cuando el proceso se realiza, comprobando opcionalmente la ExitCode , y reanudar el marcador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top