【问题标题】:Workflow 4.0 custom activity to start external processWorkflow 4.0 自定义活动以启动外部流程
【发布时间】:2010-12-24 22:47:40
【问题描述】:

我正在试用 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.BeginResumeBookmarkinstance.EndResumeBookmark 可用。

我也不确定如何改变它来处理外部进程,而不仅仅是查看目录的内容。

这甚至是处理这类事情的最佳方法吗?

【问题讨论】:

    标签: workflow-foundation workflow-foundation-4 .net-4.0-beta-2


    【解决方案1】:

    这种方法非常适合运行其他进程。使用 Process.WaitForExit 检查进程何时完成,可选择检查ExitCode,并恢复书签。

    【讨论】:

    • 我也打算提出这个建议。这里的另一件事是您可以使用 InvokeMethod 活动来实现这一点,而不是编写自定义活动。
    【解决方案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 可能是更好的选择(它当然更容易管理)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      相关资源
      最近更新 更多