博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

WF4 Beta2:IExecutionProperty的使用

Posted on 2009-11-17 21:00  生鱼片  阅读(630)  评论(1编辑  收藏  举报

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>

结果如下:

clip_image002