用于启动外部流程的 Workflow 4.0 自定义活动
-
18-09-2019 - |
题
我正在尝试工作流 4.0,并希望编写一个自定义活动来启动外部可执行文件,等待该过程完成,然后恢复工作流中的后续步骤。
我发现以下示例(在页面底部)显示了如何编写一个活动来等待文件到达特定目录:
我对这个例子有几个问题。首先,当我添加以下代码时:
void FileCreated(object sender, FileSystemEventArgs e)
{
instance.ResumeBookmark(bookmarkName, e.FullPath);
fsw.Dispose();
}
instance.Resumebookmark(...)
似乎不可用,但是 instance.BeginResumeBookmark
和 instance.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 检查进程何时完成,可以选择检查 退出代码, ,然后恢复书签。
不隶属于 StackOverflow