3

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

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

Creating Custom Activities with Workflow 4.0

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

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

instance.Resumebookmark(...), кажется, не быть в наличии, но instance.BeginResumeBookmark и instance.EndResumeBookmark есть.

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

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

ответ

3

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

2

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

+0

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