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

我也不确定如何改变这种方式来处理外部进程,而不是仅仅关注目录的内容。

这甚至是解决此类问题的最佳方法吗?

最佳答案

我建议编写一个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可能是一个更好的选择(当然,它更易于管理)。

关于workflow-foundation - Workflow 4.0自定义事件以启动外部流程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1875775/

10-10 00:41