Domanda

Sto provando Workflow 4.0 e sperando di scrivere un'attività personalizzata per avviare un eseguibile esterno, attendere che quel processo per completare e poi riprendere le successive fasi del flusso di lavoro.

Ho trovato il seguente esempio che mostra (verso la parte inferiore della pagina) Come scrivere un'attività di attesa di un file per arrivare in una directory specifica:

Creazione di attività personalizzate con Workflow 4.0

Ho un paio di problemi con l'esempio. In primo luogo, quando aggiungo il seguente codice:

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

instance.Resumebookmark(...) non sembra essere disponibile, ma instance.BeginResumeBookmark e instance.EndResumeBookmark sono.

Sono anche sicuro di come cambiare questo intorno a che fare con processi esterni, piuttosto che solo a guardare il contenuto di una directory.

E 'questo anche l'approccio migliore per questo genere di cose?

È stato utile?

Soluzione

Vorrei suggerire di scrivere un AyncCodeActivity ed evitare i segnalibri del tutto. Ecco un esempio di un'attività personalizzata che restituisce il codice di uscita del processo come il risultato:

    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;
        }
    }

In generale, i segnalibri sono grandi se l'evento esterno non verrà per un potenzialmente molto tempo. Se il processo si sta invocando è di breve durata, un AsyncCodeActivity potrebbe essere una scelta migliore (è certamente un uno facile da gestire).

Altri suggerimenti

Questo approccio funziona perfettamente per l'esecuzione di altri processi. Utilizzare il Process.WaitForExit per verificare quando il processo è fatto, opzionalmente controllando il ExitCode , e riprendere il segnalibro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top