Frage

Ich versuche, aus Workflow-4.0 und der Hoffnung auf eine benutzerdefinierte Aktivität schreiben eine externe ausführbare Datei zu starten, für diesen Prozess warten zu vervollständigen und dann die nachfolgenden Schritte im Workflow fortzusetzen.

Ich fand das folgende Beispiel, das zeigt (in Richtung der unten auf der Seite), wie eine Aktivität zu warten auf eine Datei schreiben in einem bestimmten Verzeichnis zu gelangen:

Erstellen von benutzerdefinierten Aktivitäten mit Workflow 4.0

Ich habe ein paar Probleme mit dem Beispiel. Erstens, wenn ich den folgenden Code:

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

instance.Resumebookmark(...) scheint nicht vorhanden zu sein, aber instance.BeginResumeBookmark und instance.EndResumeBookmark sind.

Ich bin auch nicht sicher, wie diese um sich ändern mit externen Prozessen beschäftigen, anstatt nur den Inhalt eines Verzeichnisses zu beobachten.

Ist dies auch der beste Ansatz für diese Art der Sache?

War es hilfreich?

Lösung

würde ich vorschlagen, ein AyncCodeActivity Schreiben und Lesezeichen ganz vermeiden. Hier ist ein Beispiel für eine benutzerdefinierte Aktivität, die den Prozess Exit-Code als Ergebnis zurückgibt:

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

Generell Lesezeichen sind groß, wenn das externe Ereignis nicht für eine möglicherweise lange Zeit kommen wird. Wenn der Prozess Du Aufruf kurzlebig ist, ein AsyncCodeActivity könnte eine bessere Wahl sein (es ist sicherlich ein einfacher eine verwalten).

Andere Tipps

Dieser Ansatz funktioniert sehr gut für andere Prozesse ausgeführt werden. Verwenden Sie die Process.WaitForExit zu überprüfen, wenn der Prozess abgeschlossen ist, gegebenenfalls die Überprüfung der Exit , und setzen Sie das Lesezeichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top