随笔 - 234, 文章 - 12, 评论 - 1671, 阅读 - 74万
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

WF4 Beta2:IExecutionProperty的使用

Posted on   生鱼片  阅读(632)  评论(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

 

编辑推荐:
· 如何编写易于单元测试的代码
· 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——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示