本节主要介绍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
结果