WF4.0 Beta1 CancellationScope 取消容器
WF4.0 Beta1 CancellationScope 取消容器
在WF4中,可以使用[Parallel] 并行执行多条分支,当[Parallel]中的所有分支都执行完成后,[Parallel]结束.
在WF4中,可以使用[Pick]实现多条等待分支的单线执行,当一条分支被触发后,其它分支就不会被触发了,当触发的分支完成后,[Pick]结束
但有时我们会的这样一种需求,我们需要并行执行多条分支,当并行分支中的一条或几条分支满足指定条件时,其它正在执行的分支就不执了.同时,为了保证数据的完整性,我们需要在那些可能要取消的分支中余留一组代码.这组代码用于在该分支被取消后做一些收尾工做.
CancellationScope 取消容器
类名: System.Activities.Statements.CancellationScope
基类: NativeActivity
文件: System.Activities.dll
类型: sealed
说明: 1. 在WF4中,可以使用[Parallel] 并行执行多条分支,当[Parallel]中的所有分支都执行完成后,[Parallel]结束.
可以使用[Pick]实现多条等待分支的单线执行,当一条分支被触发后,其它分支就不会被触发了,当触发的分支完成后,[Pick]结束
但有时我们会的这样一种需求,我们需要并行执行多条分支,当并行分支中的一条或几条分支满足指定条件时,其它正在执行的分支就不执了.同时,为了保证数据的完整性,我们需要在那些可能要取消的分支中余留一组代码.这组代码用于在该分支被取消后做一些收尾工做.
2. [CancellationScope]由[Body]与 [CancelHandler] 两部分组成,[Body]为正常执行路径, 如果取消执行会调用 [CancelHandler]中的内容
3. 可以在[Parallel]容器中使用[CancellationScope],当[Parallel]的[CompletionCondition]属性为[True]时,[Parallel]容器会在其内部[CancellationScope]容器执行完成后,结束其它正在执行的并行分支.如果其它正在执行的并行分支是[CancellationScope],则会调用该[CancellationScope]的[CancelHandler]
例
流程 | <p:Activity mc:Ignorable="" x:Class="WorkflowConsoleApplication4.Sequence1" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities/design" xmlns:__Sequence1="clr-namespace:WorkflowConsoleApplication4;" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:p="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <p:Sequence> <p:Parallel CompletionCondition="[True]"> <p:CancellationScope DisplayName="CancellationScope:A"> <p:CancellationScope.CancelHandler> <p:WriteLine DisplayName="WriteLine:Cancel A">["Cancel A"]</p:WriteLine> </p:CancellationScope.CancelHandler> <p:Sequence> <p:WriteLine DisplayName="WriteLine:begin A">["begin A"]</p:WriteLine> <p:Delay DisplayName="Delay:5">[New TimeSpan(0, 0, 5)]</p:Delay> <p:WriteLine DisplayName="WriteLine:end A">["end A"]</p:WriteLine> </p:Sequence> </p:CancellationScope> <p:CancellationScope DisplayName="CancellationScope:B"> <p:CancellationScope.CancelHandler> <p:WriteLine DisplayName="WriteLine:Cancel B">["Cancel B"]</p:WriteLine> </p:CancellationScope.CancelHandler> <p:Sequence> <p:WriteLine DisplayName="WriteLine:begin B">["begin B"]</p:WriteLine> <p:Delay DisplayName="Delay:10">[New TimeSpan(0, 0, 10)]</p:Delay> <p:WriteLine DisplayName="WriteLine:end B">["end B"]</p:WriteLine> </p:Sequence> </p:CancellationScope> <p:CancellationScope DisplayName="CancellationScope:C"> <p:CancellationScope.CancelHandler> <p:WriteLine DisplayName="WriteLine:Cancel C">["Cancel C"]</p:WriteLine> </p:CancellationScope.CancelHandler> <p:Sequence> <p:WriteLine DisplayName="WriteLine:begin C">["begin C"]</p:WriteLine> <p:Delay DisplayName="Delay:3">[New TimeSpan(0, 0, 3)]</p:Delay> <p:WriteLine DisplayName="WriteLine:end C">["end C"]</p:WriteLine> </p:Sequence> </p:CancellationScope> <p:Sequence DisplayName="Sequence:D"> <p:WriteLine DisplayName="WriteLine:begin D">["begin D"]</p:WriteLine> <p:Delay DisplayName="Delay:8">[New TimeSpan(0, 0, 8)]</p:Delay> <p:WriteLine DisplayName="WriteLine:end D">["end D"]</p:WriteLine> </p:Sequence> </p:Parallel> <p:WriteLine DisplayName="WriteLine:wxwinter">["wxwinter"]</p:WriteLine> </p:Sequence> </p:Activity> |
宿主 | WorkflowInstance myInstance = new WorkflowInstance(new Sequence1()); myInstance.OnCompleted = delegate(WorkflowCompletedEventArgs e) { System.Console.WriteLine("Completed "); };
myInstance.Run();
System.Console.Read(); |
结果 | |
[Parallel]的[CompletionCondition]属性为[False]时 结果 | [Parallel]的[CompletionCondition]属性为[False]时
|
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)