IExecutionProperty接口:用来配置线程本地存储(Thread Local Storage)区之前和之后的相关活动的工作项的机制,提供了执行属性。
该接口有两个成员:
CleanupWorkflowThread 和SetupWorkflowThread 表示在建立和销毁时执行接口。
由于WF4 Activity实例的执行原理为: WF运行时在内部为每个工作流维护了一个工作项队列。然后,创建一个Scheduler类的实例来负责从此工作项队列中取出和追加工作项,并执行之。工作流执行时,所有需要被执行的Activity会被封装为一个WorkItem,被放到一个工作项队列中,然后由WF4调度器(其实就是Scheduler类的实例)负责从此队列中取出工作项执行。 工作项的执行可以由线程池中的线程承担。,也可以由调用者线程来承担。
下面的自定义活动有一个 public Activity Body { get; set; }属性,在Execute中使用 context.ScheduleActivity(this.Body);来执行。我们通过使用上面接口来设置在工作项队列中取出和追加工作项即Activity时来设置控制台字体颜色,在工作流设计我们使用Delay活动让不同的Sequence交叉执行。
例子:
using System;
using System.Activities;
public sealed class ConsoleColorScope : NativeActivity
{
public ConsoleColorScope()
: base()
{
}
public ConsoleColor Color { get; set; }
public Activity Body { get; set; }
protected override void Execute(NativeActivityContext context)
{
context.Properties.Add(ConsoleColorProperty.Name, new ConsoleColorProperty(this.Color));
if (this.Body != null)
{
context.ScheduleActivity(this.Body);
}
}
class ConsoleColorProperty : IExecutionProperty
{
public const string Name = "ConsoleColorProperty";
ConsoleColor original;
ConsoleColor color;
public ConsoleColorProperty(ConsoleColor color)
{
this.color = color;
}
void IExecutionProperty.SetupWorkflowThread()
{
original = Console.ForegroundColor;
Console.ForegroundColor = color;
}
void IExecutionProperty.CleanupWorkflowThread()
{
Console.ForegroundColor = original;
}
}
}
工作流设计:
<?xml version="1.0" encoding="utf-8"?>
<Sequence xmlns=http://schemas.microsoft.com/netfx/2009/xaml/activities
xmlns:mse="clr-namespace:Microsoft.Samples.ExecutionProperties;assembly=ExecutionProperties" xmlns:p="http://schemas.microsoft.com/netfx/2008/xaml/schema" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<WriteLine Text="BEFORE" />
<Parallel>
<mse:ConsoleColorScope Color="Red">
<mse:ConsoleColorScope.Body>
<Sequence>
<WriteLine Text="ONE" />
<Delay Duration="00:00:06" />
<WriteLine Text="TWO" />
</Sequence>
</mse:ConsoleColorScope.Body>
</mse:ConsoleColorScope>
<mse:ConsoleColorScope Color="Yellow">
<mse:ConsoleColorScope.Body>
<Sequence>
<WriteLine Text="THREE" />
<Delay Duration="00:00:02" />
<WriteLine Text="FOUR" />
</Sequence>
</mse:ConsoleColorScope.Body>
</mse:ConsoleColorScope>
<mse:ConsoleColorScope Color="Green">
<mse:ConsoleColorScope.Body>
<Sequence>
<WriteLine Text="FIVE" />
<Delay Duration="00:00:04" />
<WriteLine Text="SIX" />
</Sequence>
</mse:ConsoleColorScope.Body>
</mse:ConsoleColorScope>
</Parallel>
<WriteLine Text="AFTER" />
</Sequence>
结果如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器