我正在尝试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
可用。我也不确定如何改变这种方式来处理外部进程,而不是仅仅关注目录的内容。
这甚至是解决此类问题的最佳方法吗?
最佳答案
我建议编写一个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/