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

Я пробую 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 являются.

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

Это даже лучший подход для такого рода вещей?

2 ответа

Решение

Я бы предложил написать 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 может быть лучшим выбором (им, безусловно, легче управлять).

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

Другие вопросы по тегам