【问题标题】:How to use Bookmark without user input?如何在没有用户输入的情况下使用书签?
【发布时间】:2014-08-21 14:33:39
【问题描述】:
我是 Windows Workflow 的新手,正在使用 4.5 创建一个长时间运行的工作流。我做了很多在线搜索,试图找到一种无需用户输入即可创建书签和简历书签的方法。到目前为止,我阅读的信息都需要 Console.ReadLine (用户输入)才能恢复书签。书签是否仅用于人工输入?我现在正在使用延迟活动,但想使用书签。
我的 Workflow.xaml 是这样的:
向需要完成各自任务的审阅者发送电子邮件。这
电子邮件只是一个通知。没有批准或拒绝按钮。
延迟活动。这是为了让工作流在持久化中持久化
数据库。
检查另一个数据库以查看审阅者是否更新了某些数据。
如果审阅者尚未更新数据,则再次延迟活动。
向审批者发送电子邮件。如果数据更新。审批者的响应将被记录在数据库中。电子邮件只是一个通知。
再次延迟活动,等待审批者在数据库中更新响应。
等等。
非常感谢您的帮助。
【问题讨论】:
标签:
c#
workflow-foundation-4
workflow-foundation
workflow-activity
workflowservice
【解决方案1】:
书签不需要用户输入。
您在活动中创建书签:
context.CreateBookmark("bookmarkName", new BookmarkCallback(OnResumeBookmark));
“OnResumeBookmark”是您活动中的一个方法。
然后,当您恢复工作流程时,您可以使用:
WorkflowApplication wfApp= new WorkflowApplication(new NameOFWorkflow());
wfApp.Run();
wfApp.ResumeBookmark("bookmarkName");
OnResumeBookmark 然后将执行。
这里是更完整的版本http://msdn.microsoft.com/en-us/library/ee191721(v=vs.110).aspx
其中有关 console.read 的内容只是向您展示书签名称如何成为变量而不是字符串的一种方式:
context.CreateBookmark(BookmarkName.Get(context), <-- get name from the InArgumen
【解决方案2】:
这里是自定义活动的示例代码:
public sealed class WaitForResponse<TResult> : NativeActivity<TResult>
{
public string ResponseName { get; set; }
protected override bool CanInduceIdle
{
get
{
return true;
}
}
protected override void Execute(NativeActivityContext context)
{
context.CreateBookmark(this.ResponseName, new BookmarkCallback(this.ReceivedResponse));
// Put code here...
}
void ReceivedResponse(NativeActivityContext context, Bookmark bookmark, object obj)
{
this.Result.Set(context, (TResult)obj);
}
此活动将运行方法 Execute 并等待(持久/卸载)直到 ResumeBookmark。 ResumeBookmark 可以是 WCF 调用或 WorkflowApplication.ResumeBookmark 的调用。