我正在尝试工作流 4.0,并希望编写一个自定义活动来启动外部可执行文件,等待该过程完成,然后恢复工作流中的后续步骤。

我发现以下示例(在页面底部)显示了如何编写一个活动来等待文件到达特定目录:

使用工作流 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可能是一个更好的选择(它肯定是一个更简单的一个管理)。

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top