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

C# 如何在没有用户输入的情况下使用书签?,c#,workflow-foundation-4,workflow-foundation,workflow-activity,workflowservice,C#,Workflow Foundation 4,Workflow Foundation,Workflow Activity,Workflowservice,我不熟悉Windows工作流,正在使用4.5创建长期运行的工作流。我做了大量的在线搜索,试图找到一种不用用户输入就能创建书签和简历书签的方法。到目前为止,我阅读的信息都需要Console.ReadLine(用户输入)才能恢复书签。书签是否仅用于人工输入?我现在正在使用延迟活动,但想使用书签 My Workflow.xaml如下所示: 向要求完成各自任务的审阅者发送电子邮件。这个 电子邮件只是一种通知。没有“批准”或“拒绝”按钮 延迟活动。这是为了使工作流在持久化中持久化 数据库 检查另一个数据库

我不熟悉Windows工作流,正在使用4.5创建长期运行的工作流。我做了大量的在线搜索,试图找到一种不用用户输入就能创建书签和简历书签的方法。到目前为止,我阅读的信息都需要Console.ReadLine(用户输入)才能恢复书签。书签是否仅用于人工输入?我现在正在使用延迟活动,但想使用书签

My Workflow.xaml如下所示:

  • 向要求完成各自任务的审阅者发送电子邮件。这个 电子邮件只是一种通知。没有“批准”或“拒绝”按钮

  • 延迟活动。这是为了使工作流在持久化中持久化 数据库

  • 检查另一个数据库,查看某些数据是否由审阅者更新

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

  • 向批准人发送电子邮件。如果数据被更新。批准人的响应将记录在数据库中。电子邮件只是一个通知

  • 再次延迟活动,等待批准人在数据库中更新响应

  • 等等


    非常感谢您的帮助。

    书签不需要用户输入

    您可以在活动中创建书签:

    context.CreateBookmark("bookmarkName", new BookmarkCallback(OnResumeBookmark));
    
    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);
        }
    
    其中“OnResumeBookmark”是活动中的一种方法

    然后,当您恢复工作流时,请使用以下命令:

    WorkflowApplication wfApp= new WorkflowApplication(new NameOFWorkflow());
    
    wfApp.Run();
    
    wfApp.ResumeBookmark("bookmarkName");
    
    然后将执行OnResumeBookmark

    这是一个更完整的版本

    这里关于console.read的内容只是向您展示书签名称如何可以是变量而不是字符串的一种方式:

    context.CreateBookmark(BookmarkName.Get(context),  <-- get name from the InArgumen
    

    context.CreateBookmark(BookmarkName.Get(context),这里是一个自定义活动的示例代码:

    context.CreateBookmark("bookmarkName", new BookmarkCallback(OnResumeBookmark));
    
    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);
        }
    
    公共密封类WaitForResponse:NativeActivity
    {
    公共字符串ResponseName{get;set;}
    受保护的覆盖布尔Caninducidel
    {
    得到
    {
    返回true;
    }
    }
    受保护的覆盖无效执行(NativeActivityContext上下文)
    {
    CreateBookmark(this.ResponseName,newbookmarkCallback(this.ReceivedResponse));
    //把代码放在这里。。。
    }
    void ReceivedResponse(NativeActivityContext上下文、书签书签、对象对象)
    {
    this.Result.Set(context,(TResult)obj);
    }
    
    此活动将运行方法Execute并等待(持久/卸载),直到出现ResumeBookmark。ResumeBookmark可以是WCF调用或WorkflowApplication.ResumeBookmark的调用