WF4.0 基础篇 (十七) Bookmark

来源:互联网 发布:倚天行情软件 编辑:程序博客网 时间:2024/05/12 11:25

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

 

本文例子下载:

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

本文例子说明

Bookmark

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

 

无返回值Bookmark

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

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

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

publicsealed class noResultBookmark : NativeActivity

    {

publicInArgument<string> bookmarkName {get; set; }

protectedoverride bool CanInduceIdle

        {

get

            {    return true;    }

        }

protectedoverride 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);

returnUnhandledExceptionAction.Cancel;

        }

void workflowIdel(WorkflowApplicationIdleEventArgs e)

         {

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

 

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

foreach (var itemin e.Bookmarks)

             {

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

             }

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

         }

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

         

WorkflowApplication instance =null;

 

privatevoid 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();

 

        }

 

privatevoid 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 vin 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

publicsealed class resultBookmark<T> :  NativeActivity<T>

    {

publicInArgument<string> bookmarkName {get; set; }

 

protectedoverride bool CanInduceIdle

        {

get

            {     return true;        }

        }

protectedoverride void Execute(NativeActivityContext context)

        {

string bookmark = context.GetValue(bookmarkName);

            context.CreateBookmark(bookmark,newBookmarkCallback(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);

returnUnhandledExceptionAction.Cancel;

        }

void workflowIdel(WorkflowApplicationIdleEventArgs e)

         {

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

 

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

foreach (var itemin e.Bookmarks)

             {

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

             }

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

         }

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

         

WorkflowApplication instance =null;

 

privatevoid 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();

 

        }

 

privatevoid 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 vin 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);

returnUnhandledExceptionAction.Cancel;

        }

void workflowIdel(WorkflowApplicationIdleEventArgs e)

         {

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

 

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

foreach (var itemin e.Bookmarks)

             {

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

             }

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

         }

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

         

WorkflowApplication instance =null;

 

privatevoid 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();

 

        }

 

privatevoid 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 vin 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);

returnUnhandledExceptionAction.Cancel;

        }

void workflowIdel(WorkflowApplicationIdleEventArgs e)

         {

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

 

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

foreach (var itemin e.Bookmarks)

             {

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

             }

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

         }

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

         

WorkflowApplication instance =null;

 

privatevoid 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 = newDictionary<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();

 

        }

 

privatevoid 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 vin 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

 

结果