Пользовательское действие Workflow 4.0 для запуска внешнего процесса

StackOverflow https://stackoverflow.com/questions/1875775

Вопрос

Я тестирую Workflow 4.0 и надеюсь написать пользовательское действие для запуска внешнего исполняемого файла, дождаться завершения этого процесса, а затем возобновить последующие шаги в рабочем процессе.

Я нашел следующий пример, который показывает (в нижней части страницы), как записать действие в ожидание поступления файла в определенный каталог:

Создание пользовательских действий с помощью Workflow 4.0

У меня есть пара проблем с этим примером.Во-первых, когда я добавляю следующий код:

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

instance.Resumebookmark(...) кажется, что он недоступен, но instance.BeginResumeBookmark и instance.EndResumeBookmark являются.

Я также не уверен в том, как изменить это, чтобы иметь дело с внешними процессами, а не просто просматривать содержимое каталога.

Является ли это вообще лучшим подходом для такого рода вещей?

Это было полезно?

Решение

Я бы предложил написать AyncCodeActivity и вообще избегать закладок.Вот пример пользовательского действия, которое возвращает код завершения процесса в качестве результата:

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

В общем, закладки хороши, если внешнее событие не будет приходить в течение потенциально длительного времени.Если вызываемый вами процесс недолговечен, лучшим выбором может быть AsyncCodeActivity (им, безусловно, проще управлять).

Другие советы

Этот подход отлично работает для запуска других процессов.Используйте процесс.Подождите, пока forexit проверит, когда процесс будет завершен, при необходимости проверив Код выхода, и возобновите закладку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top