Workflow 4.0自定义活动以启动外部进程

时间:2009-12-09 18:16:21

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

我正在尝试使用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

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

对于这种事情,这甚至是最好的方法吗?

2 个答案:

答案 0 :(得分: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可能是更好的选择(它当然更容易管理)。

答案 1 :(得分:2)

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