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>
结果如下: