zoukankan      html  css  js  c++  java
  • WF4.0 基础篇 (十七) Bookmark

    本节主要介绍WF4中无返回值Bookmark与有返回值Bookmark,以及Bookmark在parallel,ParallelForEach,ForEach中的使用.

     

    本文例子下载:

    https://files.cnblogs.com/foundation/BookmarkSample.rar

    本文例子说明

    Bookmark

    Bookmark可使用流程Idle并触发实例的OnIdle

     

    无返回值Bookmark

    要定义具备Bookmark的Activit,可从 NativeActivity继承,override [Execute 方法],使用[NativeActivityContext.CreateBookmark方法]添加Bookmark

    需要override [ CanInduceIdle 属性],使其返回值为[True]

    可用[实例.ResumeBookmark方法]触发Bookmark

    public sealed class noResultBookmark : NativeActivity

    {

    public InArgument<string> bookmarkName { get; set; }

    protected override bool CanInduceIdle

    {

    get

    { return true; }

    }

    protected override void Execute(NativeActivityContext context)

    {

    string bookmark = context.GetValue(bookmarkName);

    context.CreateBookmark(bookmark);

    System.Console.WriteLine("创建bookmark:{0}", bookmark);

    }

    }

     

    例:基本使用

    流程

    宿主

     

    //===================================================

    void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

    {

    instance = null;

    System.Console.WriteLine("workflowCompleted:{0}", e.CompletionState.ToString());

    }

     

    void aborted(WorkflowApplicationAbortedEventArgs e)

    {

    instance = null;

    System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);

    }

     

    UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)

    {

    System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);

    return UnhandledExceptionAction.Cancel;

    }

    void workflowIdel(WorkflowApplicationIdleEventArgs e)

    {

    System.Console.WriteLine("Idle:{0}", e.InstanceId);

     

    System.Console.WriteLine("--------BookmarkName---------------------------");

    foreach (var item in e.Bookmarks)

    {

    System.Console.WriteLine("{0}", item.BookmarkName);

    }

    System.Console.WriteLine("================================");

    }

    //==================================================

     

    WorkflowApplication instance = null;

     

    private void button_Run_Click(object sender, RoutedEventArgs e)

    {

    instance = new WorkflowApplication(new WFLibrary.noResultBookmarkWorkflow());

     

    instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

    instance.OnUnhandledException = unhandledExceptionl;

    instance.Aborted = aborted;

    instance.Idle = workflowIdel;

    instance.Run();

     

    }

     

    private void button_triggering_Click(object sender, RoutedEventArgs e)

    {

    string bookName = textBoxBookmark.Text;

     

    if (instance != null)

    {

    if (instance.GetBookmarks().Count(p => p.BookmarkName == bookName) == 1)

    {

    instance.ResumeBookmark(bookName, null);

    }

    else

    {

    foreach (var v in instance.GetBookmarks())

    {

    System.Console.WriteLine("--------请从下面选项中选择一BookmarkName---------------------------");

    System.Console.WriteLine("BookmarkName:{0}:,OwnerDisplayName:{1}", v.BookmarkName, v.OwnerDisplayName);

    System.Console.WriteLine("================================");

    }

    }

    }

    else

    {

    MessageBox.Show("没有创ä建实例");

    }

    }

    结果

     

    有返回值Bookmark

    要定义具备Bookmark的Activit,可从 NativeActivity<T> 继承,override [Execute 方法],使用[NativeActivityContext.CreateBookmark方法]添加Bookmark

    需要override [ CanInduceIdle 属性],使其返回值为[True]

    可用[实例.ResumeBookmark方法]触发Bookmark

    public sealed class resultBookmark<T> : NativeActivity<T>

    {

    public InArgument<string> bookmarkName { get; set; }

     

    protected override bool CanInduceIdle

    {

    get

    { return true; }

    }

    protected override void Execute(NativeActivityContext context)

    {

    string bookmark = context.GetValue(bookmarkName);

    context.CreateBookmark(bookmark,new BookmarkCallback(bookmarkCallback));

    System.Console.WriteLine("创建bookmark:{0}", bookmark);

    }

    void bookmarkCallback(NativeActivityContext context, Bookmark bookmark, object obj)

    {

    this.Result.Set(context, (T)obj);

    }

    }

     

    例:基本使用

    流程

    宿主

     

    //===================================================

    void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

    {

    instance = null;

    System.Console.WriteLine("workflowCompleted:{0}", e.CompletionState.ToString());

    }

     

    void aborted(WorkflowApplicationAbortedEventArgs e)

    {

    instance = null;

    System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);

    }

     

    UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)

    {

    System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);

    return UnhandledExceptionAction.Cancel;

    }

    void workflowIdel(WorkflowApplicationIdleEventArgs e)

    {

    System.Console.WriteLine("Idle:{0}", e.InstanceId);

     

    System.Console.WriteLine("--------BookmarkName---------------------------");

    foreach (var item in e.Bookmarks)

    {

    System.Console.WriteLine("{0}", item.BookmarkName);

    }

    System.Console.WriteLine("================================");

    }

    //==================================================

     

    WorkflowApplication instance = null;

     

    private void button_Run_Click(object sender, RoutedEventArgs e)

    {

    instance = new WorkflowApplication(new WFLibrary.resultBookmarkWorkflow());

     

    instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

    instance.OnUnhandledException = unhandledExceptionl;

    instance.Aborted = aborted;

    instance.Idle = workflowIdel;

    instance.Run();

     

    }

     

    private void button_triggering_Click(object sender, RoutedEventArgs e)

    {

    string bookName = textBoxBookmark.Text;

    string inputValue = textBox_Value.Text;

     

    if (instance != null)

    {

    if (instance.GetBookmarks().Count(p => p.BookmarkName == bookName) == 1)

    {

    instance.ResumeBookmark(bookName,inputValue );

    }

    else

    {

    foreach (var v in instance.GetBookmarks())

    {

    System.Console.WriteLine("--------请从下面选项中选择一BookmarkName---------------------------");

    System.Console.WriteLine("BookmarkName:{0}:,OwnerDisplayName:{1}", v.BookmarkName, v.OwnerDisplayName);

    System.Console.WriteLine("================================");

    }

    }

    }

    else

    {

    MessageBox.Show("没有创建实例");

    }

    }

    结果

     

    例:在parallel中使用Bookmark

    流程

    宿主

     

    //===================================================

    void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

    {

    instance = null;

    System.Console.WriteLine("workflowCompleted:{0}", e.CompletionState.ToString());

    }

     

    void aborted(WorkflowApplicationAbortedEventArgs e)

    {

    instance = null;

    System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);

    }

     

    UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)

    {

    System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);

    return UnhandledExceptionAction.Cancel;

    }

    void workflowIdel(WorkflowApplicationIdleEventArgs e)

    {

    System.Console.WriteLine("Idle:{0}", e.InstanceId);

     

    System.Console.WriteLine("--------BookmarkName---------------------------");

    foreach (var item in e.Bookmarks)

    {

    System.Console.WriteLine("{0}", item.BookmarkName);

    }

    System.Console.WriteLine("================================");

    }

    //==================================================

     

    WorkflowApplication instance = null;

     

    private void button_Run_Click(object sender, RoutedEventArgs e)

    {

    instance = new WorkflowApplication(new WFLibrary.parallelBookmarkWorkflow());

     

    instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

    instance.OnUnhandledException = unhandledExceptionl;

    instance.Aborted = aborted;

    instance.Idle = workflowIdel;

    instance.Run();

     

    }

     

    private void button_triggering_Click(object sender, RoutedEventArgs e)

    {

    string bookName = textBoxBookmark.Text;

    string inputValue = textBox_Value.Text;

     

    if (instance != null)

    {

    if (instance.GetBookmarks().Count(p => p.BookmarkName == bookName) == 1)

    {

    instance.ResumeBookmark(bookName,inputValue );

    }

    else

    {

    foreach (var v in instance.GetBookmarks())

    {

    System.Console.WriteLine("--------请从下面选项中选择一BookmarkName---------------------------");

    System.Console.WriteLine("BookmarkName:{0}:,OwnerDisplayName:{1}", v.BookmarkName, v.OwnerDisplayName);

    System.Console.WriteLine("================================");

    }

    }

    }

    else

    {

    MessageBox.Show("没有创建实例");

    }

    }

    结果

     

    例:在ParallelForEach中使用Bookmark

    流程

    参数

     

    变量

     

    流程

    宿主

     

    //===================================================

    void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

    {

    instance = null;

    System.Console.WriteLine("workflowCompleted:{0}", e.CompletionState.ToString());

    }

     

    void aborted(WorkflowApplicationAbortedEventArgs e)

    {

    instance = null;

    System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);

    }

     

    UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)

    {

    System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);

    return UnhandledExceptionAction.Cancel;

    }

    void workflowIdel(WorkflowApplicationIdleEventArgs e)

    {

    System.Console.WriteLine("Idle:{0}", e.InstanceId);

     

    System.Console.WriteLine("--------BookmarkName---------------------------");

    foreach (var item in e.Bookmarks)

    {

    System.Console.WriteLine("{0}", item.BookmarkName);

    }

    System.Console.WriteLine("================================");

    }

    //==================================================

     

    WorkflowApplication instance = null;

     

    private void button_Run_Click(object sender, RoutedEventArgs e)

    {

     

    System.Collections.Generic.SortedSet<string> nameList = new SortedSet<string>();

    nameList.Add("wxd");

    nameList.Add("wxwinter");

    nameList.Add("lzm");

    nameList.Add("dd");

    System.Collections.Generic.Dictionary<string, object> dictionary = new Dictionary<string, object>();

    dictionary.Add("myNameList", nameList);

     

    instance = new WorkflowApplication(new WFLibrary.ParallelForEachWorkflow(), dictionary);

     

    instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

    instance.OnUnhandledException = unhandledExceptionl;

    instance.Aborted = aborted;

    instance.Idle = workflowIdel;

    instance.Run();

     

    }

     

    private void button_triggering_Click(object sender, RoutedEventArgs e)

    {

    string bookName = textBoxBookmark.Text;

    string inputValue = textBox_Value.Text;

     

    if (instance != null)

    {

    if (instance.GetBookmarks().Count(p => p.BookmarkName == bookName) == 1)

    {

    instance.ResumeBookmark(bookName,inputValue );

    }

    else

    {

    foreach (var v in instance.GetBookmarks())

    {

    System.Console.WriteLine("--------请从下面选项中选择一BookmarkName---------------------------");

    System.Console.WriteLine("BookmarkName:{0}:,OwnerDisplayName:{1}", v.BookmarkName, v.OwnerDisplayName);

    System.Console.WriteLine("================================");

    }

    }

    }

    else

    {

    MessageBox.Show("没有创建实例");

    }

    }

    结果

     

    例:在ForEach中使用Bookmark

    将[在ParallelForEach中使用Bookmark]中的ParallelForEach换成ForEach

     

    结果

     

     

     

  • 相关阅读:
    JaveScript简单数据类型(JS知识点归纳二)
    JaveScript变量的简介及其变量的简单使用(JS知识点归纳一)
    JaveScript用二分法与普通遍历(冒泡)
    include、include_once、require、require_once其区别
    POST和GET有什么区别?
    前端向后台发送请求有几种方式?
    jQuery的$.ajax方法响应数据类型有哪几种?本质上原生ajax响应数据格式有哪几种,分别对应哪个属性?
    java根据汉字生成首字母大写
    springboot+使用切面AOP动态获取自定义注解
    JavaScript基础05——严格模式
  • 原文地址:https://www.cnblogs.com/foundation/p/1642614.html
Copyright © 2011-2022 走看看