Question

Je suis d'essayer 4.0 Flux de travail et dans l'espoir d'écrire une activité personnalisée pour lancer un exécutable externe, attendez ce processus pour compléter et reprendre les étapes suivantes dans le flux de travail.

J'ai trouvé l'exemple suivant qui montre (vers le bas de la page) comment écrire une activité à l'attente d'un fichier pour arriver dans un répertoire spécifique:

Création d'activités personnalisées avec flux de travail 4.0

J'ai quelques problèmes avec l'exemple. Tout d'abord, quand j'ajoute le code suivant:

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

instance.Resumebookmark(...) ne semble pas être disponible, mais instance.BeginResumeBookmark et instance.EndResumeBookmark sont.

Je suis pas certain de la façon de changer cela autour pour faire face aux processus externes, plutôt que de simplement regarder le contenu d'un répertoire.

Est-ce même la meilleure approche pour ce genre de chose?

Était-ce utile?

La solution

Je suggère à écrire un AyncCodeActivity et éviter des signets tout à fait. Voici un exemple d'une activité personnalisée qui renvoie le code de sortie du processus que le résultat:

    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 général, les signets sont très bien si l'événement extérieur ne viendra pas pour longtemps potentiellement. Si le processus vous appeler est de courte durée, un AsyncCodeActivity peut-être un meilleur choix (il est assurément une plus facile à gérer).

Autres conseils

Cette approche fonctionne parfaitement bien pour l'exécution d'autres processus. Utilisez la Process.WaitForExit pour vérifier si le processus est effectué en vérifiant éventuellement le ExitCode , et reprendre le signet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top