我正在尝试使用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.BeginResumeBookmark
和instance.EndResumeBookmark
。
我也不确定如何改变它以处理外部进程,而不仅仅是观察目录的内容。
对于这种事情,这甚至是最好的方法吗?
答案 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,然后恢复书签。