VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • WF 4.0 Beta之旅 3全新的FlowChart

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  一:FlowChart的介绍

  FlowChart是WF4.0中引入的一种全新的工作流模式,它在 Sequential 和 StateMachine 流控制模型之间提供了一个不错的折中方案。FlowChart 允许

  您使用一种分步方法,它可以实现一些简单的决策和转换功能,但它也允许在工作流中返回先前的活动。对许多用户而言,流程图通常看起来更为直观。

  在Visual Studio 2010 Beta1中的WF工具箱中有如下与FlowChart相关的活动:

WF4.0 Beta1之旅(3):全新的FlowChart

  FlowChart实际上是包含一个flow nodes的集合,这些flow node是继承自FlowNode类的,每个Flow node可以包含多个子活动。FlowChart中的对流转

  的控制主要有FlowStep,FlowDecision,FlowSwitch,FlowStep就是在FlowChart中连接两个活动的线,他们都有一个Action属性和Next属性。Action

  属性用于执行自活动的,Next属性用于指定下一个要执行的元素。FlowSwitch类似C#中Switch语句的功能,FlowDecision相当于IF-Else的功能,FlowChart

  也是一个活动,在FlowChart的工作流中我们也可以嵌入FlowChart活动,本文我们会使用FlowChart的这三个活动来开发一个简单的猜数字游戏来认识WF4

  中添加的全新的FlowChart工作流。

  二:自定义活动的开发

  在开发我们的工作流之前,我们需要先准备几个自定义活动,关于自定义活动的开发我们会后文细说。

  1.ReadKey:读取控制台的输入的字符,并返回,代码如下:

namespace CaryGuessGame
{
  public class ReadKey : CodeActivity<char>
  {
    protected override void Execute(CodeActivityContext context)
    {
      Result.Set(context, Console.ReadKey(true).KeyChar);
    }
  }
}

 

  2.ReadInt:读取控制台输入转换为整数值,并返回,代码如下:

namespace CaryGuessGame
{
  public class ReadInt : NativeActivity<int>
  {
    InArgument<string> bookmarkName;

    public ReadInt()
      : base()
    {
    }

    public ReadInt(string bookmarkName)
      : this()
    {
      this.BookmarkName = bookmarkName;
    }

    public InArgument<string> BookmarkName
    {
      get
      {
        return this.bookmarkName;
      }
      set
      {
        ThrowIfOpen();
        this.bookmarkName = value;
      }
    }

    protected override void Execute(ActivityExecutionContext context)
    {
      context.CreateNamedBookmark(BookmarkName.Get(context),
        new BookmarkCallback(OnReadComplete));
    }

    void OnReadComplete(ActivityExecutionContext context, Bookmark bookmark, object state)
    {
      int Guess = Convert.ToInt32(state);
      this.Result.Set(context, Guess);
    }
  }
}

  3.Prompt.xaml

  项目右键添加新项,使用WorkflowInstance=》Activity模板,

 

  3.1.活动参数:

  Name:BookmarkName Direction:In Argument Type:String

  Name:Result Direction:out Argument Type:Int32

  Name:Text Direction:In Argument Type:String

  3.2.向Prompt.xaml中拖入一个Sequence活动,然后在Sequence活动中拖入一个WriteLine活动,并将WriteLine活动的Text属性绑定到Text参数。

  在WriteLine活动下边拖入我们刚才开发的ReadInt,绑定ReadInt的BookmarkName和Result属性到参数BookmarkName和Result。

  这样这个活动就完成了,如下图:

WF4.0 Beta1之旅(3):全新的FlowChart

  三:工作流设计

  1. 工作流的变量和参数

  变量:Name:Choice Type:Char Scope:FlowChart

  参数:Name:MaxNumber Direction In Type:Int32

   Name:Turns Direction out Type:Int32

  2. 工作流设计

  下面是工作流的设计,我们会使用FlowSwitch活动来让用户做不同的选择,a为游戏说明,b为开始游戏,c为退出。选择a的时候会有游戏的相关说明之

  后我们将流程回退到用户选择部分,让用户从新选择相关功能。选c就结束工作流。选b就开始游戏,即下图中flowchart活动的部分,这部分主要说明

  FlowSwitch活动的使用。具体看下面的图:

WF4.0 Beta1之旅(3):全新的FlowChart

  上面的FlowChart中在FlowSwitch活动的一个分支包含了一个FlowChart活动,该活动内部是猜数字游戏的逻辑部分,下面的变量只在这个flowChart的

 

  Scope内可见:

  变量:Name:Target type:Int32 Scope:FlowChart

   Name:Guess type:Int32 Scope:FlowChart

  FlowChart中的设计如下图:

WF4.0 Beta1之旅(3):全新的FlowChart

  这个图中就是实现我们猜数字逻辑的部分,这里有两个FlowDecision,第一判断是否猜对了,如果猜对了流程就结束了,如果猜错了就会提示用户是猜大了

  还是小了,让流程回退,用户重新猜.

  四:宿主程序

class Program
{
  static void Main(string[] args)
  {
    AutoResetEvent syncEvent = new AutoResetEvent(false);
    var wfparams = new Dictionary<string, object>() { { "MaxNumber", 50 } };

    WorkflowInstance myInstance = new WorkflowInstance(new Flowchart1(), wfparams);
    myInstance.OnCompleted = delegate(WorkflowCompletedEventArgs e)
    {
      int Turns = Convert.ToInt32(e.Outputs["Turns"]);
      if (Turns != 0)
      {
        Console.WriteLine("恭喜您猜对了,次数{0}", Turns);
      }
      syncEvent.Set();
    };
    myInstance.OnAborted = delegate(WorkflowAbortedEventArgs e)
    {
      Console.WriteLine(e.Reason);
      syncEvent.Set();
    };
    myInstance.OnUnhandledException = delegate(WorkflowUnhandledExceptionEventArgs e)
    {
      Console.WriteLine(e.UnhandledException.ToString());
      return UnhandledExceptionAction.Terminate;
    };
    myInstance.Run();
    //syncEvent.WaitOne();
    while (!syncEvent.WaitOne(10, false))
    {
      if (myInstance.GetAllBookmarks().Count > 0)
      {
        bool validEntry = false;
        while (!validEntry)
        {
          int Guess;
          if (!Int32.TryParse(Console.ReadLine(), out Guess))
          {
            Console.WriteLine("Please enter an integer.");
          }
          else
          {
            validEntry = true;
            myInstance.ResumeBookmark("EnterGuess", Guess);
          }
        }
      }
    }


  }
}

 

 

  五:运行结果如下

WF4.0 Beta1之旅(3):全新的FlowChart

  六:相关文章

WF4.0 Beta1之旅(1):基本介绍

WF4.0 Beta1之旅(2):异常处理

 

  本文示例源代码或素材下载

 

  2.ReadInt:读取控制台输入转换为整数值,并返回,代码如下:

namespace CaryGuessGame
{
  public class ReadInt : NativeActivity<int>
  {
    InArgument<string> bookmarkName;

    public ReadInt()
      : base()
    {
    }

    public ReadInt(string bookmarkName)
      : this()
    {
      this.BookmarkName = bookmarkName;
    }

    public InArgument<string> BookmarkName
    {
      get
      {
        return this.bookmarkName;
      }
      set
      {
        ThrowIfOpen();
        this.bookmarkName = value;
      }
    }

    protected override void Execute(ActivityExecutionContext context)
    {
      context.CreateNamedBookmark(BookmarkName.Get(context),
        new BookmarkCallback(OnReadComplete));
    }

    void OnReadComplete(ActivityExecutionContext context, Bookmark bookmark, object state)
    {
      int Guess = Convert.ToInt32(state);
      this.Result.Set(context, Guess);
    }
  }
}

  3.Prompt.xaml

  项目右键添加新项,使用WorkflowInstance=》Activity模板,


相关教程