3

我正在尝试 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是。

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

这甚至是这种事情的最佳方法吗?

4

2 回答 2

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 可能是一个更好的选择(它当然更容易管理)。

于 2009-12-15T22:14:29.347 回答
2

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

于 2009-12-11T09:11:37.780 回答