3

我正在嘗試工作流4.0並希望編寫自定義活動來啓動外部可執行文件,等待該過程完成,然後恢復工作流中的後續步驟。工作流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.BeginResumeBookmarkinstance.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活動來實現此目的,而不是編寫自定義活動。 –

相關問題