• WF4 Beta2:IExecutionProperty的使用


    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

     

  • 相关阅读:
    基于红帽5裁剪一个简单的Linux
    Linux系统初始化流程
    bash学习记录
    ubuntu 上安装MySQL
    Effective Modern C++ 条款4:掌握查看型别推导结果的方法
    Effective Modern C++ 条款3:理解decltype
    ubuntu 环境下向GitHub上传(push)每次都需要用户名密码问题
    Effective Modern C++ 条款2:理解auto型别推导
    Effective Modern C++  条款1:理解模板型别推导
    ubuntu16.04环境编译gSOAP
  • 原文地址:https://www.cnblogs.com/carysun/p/IExecutionProperty.html
Copyright © 2020-2023  润新知