如何在没有用户输入的情况下使用书签?

时间:2014-08-21 14:33:40

标签: c# workflow-foundation-4 workflow-foundation workflow-activity workflowservice

我是Windows Workflow的新手,我正在使用4.5创建一个长期运行的工作流程。我做了很多在线搜索,试图在没有用户输入的情况下找到创建书签和ResumeBookmark的方法。我到目前为止所阅读的信息都需要一个Console.ReadLine(用户输入)才能恢复书签。书签仅用于人类输入吗?我现在使用延迟活动,但想使用书签。

我的Workflow.xaml是这样的:

  1. 向审稿人发送电子邮件,要求他们完成各自的任务。该 电子邮件只是一个通知。没有批准或拒绝按钮。

  2. 延迟活动。这是为了使工作流在持久性中持续存在 数据库。

  3. 检查另一个数据库,以查看审阅者是否更新了某些数据。

  4. 如果审阅者未更新数据,则再次延迟活动。

  5. 向批准人发送电子邮件。如果数据更新。审批人的回复将记录在数据库中。电子邮件只是一个通知。

  6. 再次延迟活动,等待审批者更新数据库中的响应。

  7. 等等。

    我非常感谢你的帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

此处是自定义活动的示例代码:

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的调用。