Vra

Ek probeer uit Workflow 4.0 en hoop om 'n persoonlike aktiwiteit te skryf aan 'n eksterne uitvoerbare, wag vir die proses om voltooi te begin en dan hervat daaropvolgende stappe in die workflow.

Ek het die volgende voorbeeld wat toon (aan die onderkant van die bladsy) hoe om 'n aktiwiteit te skryf aan wag vir 'n lêer te kom in 'n spesifieke gids:

Skep Custom Aktiwiteite met Workflow 4.0

Ek het 'n paar probleme met die voorbeeld. Eerstens, wanneer ek voeg die volgende kode:

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

instance.Resumebookmark(...) lyk nie beskikbaar wees nie, maar instance.BeginResumeBookmark en instance.EndResumeBookmark is.

Ek is ook onseker oor hoe om hierdie rond te verander om te gaan met eksterne prosesse, eerder as om net te kyk na die inhoud van 'n gids.

Is dit selfs die beste benadering vir hierdie soort van ding?

Was dit nuttig?

Oplossing

Ek stel voor die skryf van 'n AyncCodeActivity en vermy boekmerke geheel en al. Hier is 'n voorbeeld van 'n persoonlike aktiwiteit wat opbrengste die proses uitgang kode as die resultaat:

    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 die algemeen, boekmerke is 'n groot as die eksterne gebeurtenis nie sal kom vir 'n potensieel lang tyd. As die proses wat jy is nou op aanroep is van korte duur, kan 'n AsyncCodeActivity n beter keuse wees (dit is beslis 'n makliker een om te bestuur).

Ander wenke

Hierdie benadering werk baie goed vir die uitvoer van ander prosesse. Gebruik die Process.WaitForExit om te kyk wanneer die proses gedoen word, opsioneel nagaan van die ExitCode , en hervat die boekmerk.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top