一:先来介绍两个活动 EventDrivenActivity和 ListenActivity。
EventDrivenActivity是一个等侍事件触发的容器,EventDrivenActivity第一个子结点必需是一个继承 IEventActivity接口的Activity,后面所有的结点可以是任意Activity。该活动必须具有父级活动,它的父级活动可以是ListenActivity,StateActivity或StateMachineWorkflowActivity。
如果EventDrivenActvity在状态机工作流中使用,还有如下使用限制:
1. EventDrivenActivity 可以并且只能包含一个实现了IEventActivity接口的Activity.如HandleExternalEvent或Delay。
2. 如果有 HandleExternalEventActivity 必须是第一个结点.这是因为,Windows Workflow Foundation 实现的状态机工作流模型一次只处理一个EventDrivenActivity活动。例如,如果EventDrivenActivity 活动中包含多个能够运行的 IEventActivity 活动,则会出现以下情况:某个 EventDrivenActivity 活动在等待可能永远不会执行的IEventActivity 时被阻止。这样,状态机将无法处理任何其他消息。
3. 一个StateActivity状态容器可以有多个EventDrivenActivity。
ListenActivity属于单线触发容器,当某条分支中的结点执行完成后,该ListenActivity结点就结束,继续向下执行,其他分支内的结点就不执行了。EventDrivenActivity是它唯一可以添加的子活动,并且至少必须有两个子活动。该活动无法用于状态机工作流中。
二:工作流能够使用方法和事件通过消息与宿主程序交互。 事件用于将数据发送到工作流,而工作流使用方法将数据发送到主机应用程序。在坚持学习WF(8):本地服务之调用外部方法这篇中我们说明了工作流如何使用本地服务来调用外部方法,接下来我们用一个猜数字游戏的小例子来主要说明在本地服务中如何使用事件。调用外部方法和事件处理基本的流程差不多。
1.实现事件参数类,GuessReceivedEventArgs类需要继承自ExternalDataEventArgs类,ExternalDataEventArgs类中的instanceId可以保证正确的工作流实例来接收事件。
GuessReceivedEventArgs .cs
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->using System;
using System.Workflow.Activities;
namespace GuessNumber
{
[Serializable]
public class GuessReceivedEventArgs : ExternalDataEventArgs
{
private Int32 _nextGuess;
public GuessReceivedEventArgs(Guid instanceId, Int32 nextGuess)
: base(instanceId)
{
_nextGuess = nextGuess;
}
public Int32 NextGuess
{
get { return _nextGuess; }
set { _nextGuess = value; }
}
}
}
2.定义服务接口,代码如下
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->using System;
using System.Workflow.Activities;
namespace GuessNumber
{
[ExternalDataExchange]
public interface IGuessingGame
{
void SendMessage(String message);
event EventHandler<GuessReceivedEventArgs> GuessReceived;
}
}
3.实现本地服务,先定义一个事件参数。这个也继承自ExternalDataEventArgs,虽然它不是用在工作流中,但是我们为了使用InstanceId,所以也让它继承这个类。
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->using System;
using System.Workflow.Activities;
namespace GuessNumber
{
[Serializable]
public class MessageReceivedEventArgs : ExternalDataEventArgs
{
private String _message;
public MessageReceivedEventArgs(Guid instanceId, String message)
: base(instanceId)
{
_message = message;
}
public String Message
{
get { return _message; }
set { _message = value; }
}
}
}
本地服务类,这类中共有四个成员:
SendMessage:workflow使用,由工作流实例来调用,发送一个信息到宿主程序,并且激发MessageReceive事件。
GuessReceived:workflow使用,接收下一个猜的数字,当OnGuessReceived方法调用的时候激发。
MessageReceived:宿主使用,从工作流实例接收一个信息,通过SendMessage方法激发。
OnGussReceived:宿主使用,发送一个新的猜的数字到工作流,会引发GuessReceived事件。
注意:SendMessage方法使用静态的WorkflowEnvironment.WorkflowInstanceId方法取回工作流实例的ID,WorkflowEnvironment表示正在当前线程中运行的工作流实例的事务环境。
GuessingGameService.cs
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->using System;
using System.Workflow.Runtime;
namespace GuessNumber
{
public class GuessingGameService : IGuessingGame
{
public void SendMessage(string message)
{
if (MessageReceived != null)
{
MessageReceivedEventArgs args
= new MessageReceivedEventArgs(
WorkflowEnvironment.WorkflowInstanceId,
message);
MessageReceived(this, args);
}
}
public event EventHandler<GuessReceivedEventArgs> GuessReceived;
public event EventHandler<MessageReceivedEventArgs> MessageReceived;
public void OnGuessReceived(GuessReceivedEventArgs args)
{
if (GuessReceived != null)
{
//must pass null as the sender otherwise
//the correct workflow won't receive the event.
GuessReceived(null, args);
}
}
}
}
4.设计工作流,在工作流的Initialized事件中初始化这个要猜的随机数。
{
Random random = new Random();
_theNumber = random.Next(1, 10);
Message = "Please guess a number between 1 and 10.";
}
Message属性给宿主的程序的暗示信息,指示猜的数字是大了还是小了。IsComplete属性是WhileActivity使用的,决定工作流是否完成了。
通过活动CallExternalMethodActivity设置InterfaceType和MethodName,还有message属性。
GuessReceived事件:在GuessReceived被激发的时候执行handleExternalEventActivity1_Invoked。该事件中决定用户的猜测是大了还是小了,为了完成工作流你必须处理该事件永远不发生的情况,我们要拖一个CodeActivity在右边的Event-Driven中,设置事件为一分钟,然后在拖一个TeminalActivity,如果一分钟内没猜的话就结束了。
完整的工作流如下图:
完整代码如下
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->using System;
using System.Workflow.Activities;
namespace GuessNumber
{
/**//// <summary>
/// The guessing game workflow
/// </summary>
public sealed partial class GuessingGameWorkflow
: SequentialWorkflowActivity
{
Variables and Properties#region Variables and Properties
private Int32 _theNumber;
private Boolean _isComplete = false;
private String _message = String.Empty;
public String Message
{
get { return _message; }
set { _message = value; }
}
public Boolean IsComplete
{
get { return _isComplete; }
set { _isComplete = value; }
}
#endregion
public GuessingGameWorkflow()
{
InitializeComponent();
}
private void OnInitialized(object sender, EventArgs e)
{
Random random = new Random();
_theNumber = random.Next(1, 10);
Message = "请输入1到10之间的某一个数字.";
}
private void handleExternalEventActivity1_Invoked(
object sender, ExternalDataEventArgs e)
{
GuessReceivedEventArgs eventArgs
= e as GuessReceivedEventArgs;
if (eventArgs != null)
{
if (eventArgs.NextGuess < _theNumber)
{
Message = "请输入一个更大的数字.";
}
else if (eventArgs.NextGuess > _theNumber)
{
Message = "请输入一个更小的数字.";
}
else
{
Message = String.Format(
"恭喜您,猜对了{0}.", _theNumber);
IsComplete = true;
}
}
}
}
}
实现宿主程序,代码如下
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->using System;
using System.Windows.Forms;
using System.Workflow.Activities;
using System.Workflow.Runtime;
namespace GuessNumber
{
/**//// <summary>
/// The WinForm for the number guessing game
/// </summary>
public partial class Form1 : Form
{
color:
发表评论
-
平淡的2007
2007-12-24 08:04 784早上起来,送女朋友去公交车站,然后回来赶紧打开电脑,先 ... -
DreamSpark发布,高校学生免费使用Visual Studio 2008 Professional Edition 等微软软件
2008-02-20 13:23 1380今天上网无意中搜索到学生可以免费使用VS2008专业版,后来又 ... -
坚持学习WF(1):从HelloWorld开始
2008-04-04 16:30 849[置顶]坚持学习WF文章索 ... -
坚持学习WF(2):WF创作模式和设计时工具
2008-04-05 17:19 599[置顶]坚持学习WF文章索 ... -
坚持学习WF(3):WF框架概览
2008-04-08 07:27 736[置顶]坚持学习WF文章索 ... -
坚持学习WF(4):活动(Activity)和依赖属性(DependencyProperty)
2008-04-12 00:01 1102[置顶]坚持学习WF文章索引 活动(Activity) 活动 ... -
坚持学习WF(5):自定义活动(CustomActivity)
2008-04-13 15:25 881当WF提供的标准活动不能满足我们的需求的时候,我们就需要定义自 ... -
MOSS点滴(1):如何开发和部署feature
2008-04-16 21:35 806Features 是MOSS 2007以开箱即用的一套新功能, ... -
MOSS点滴(2):自定义Application Page
2008-04-19 20:07 809在MOSS中后台管理的页面都是Application Pag ... -
坚持学习WF(6):开发可复用的宿主程序
2008-04-21 21:45 660我们之前写工作流宿主 ... -
MOSS点滴(3):说说MOSS中的母版页
2008-04-25 21:15 1135MOSS中有两种页面:Site P ... -
MOSS点滴(4):实现Form认证
2008-04-29 21:12 666本文主要参考了网上的一些文章,但有些文章有些地方说的不是很明确 ... -
坚持学习WF(7):流程控制(Flow Control)
2008-04-30 18:10 772本文主要说说WF中和流 ... -
坚持学习WF(8):本地服务之调用外部方法
2008-05-09 08:17 718WF提供了一组核心服务 ... -
MOSS中的WebPart开发
2008-05-10 13:53 1024由于在asp.net1.1的时候asp.net中还没有webp ... -
坚持学习WF(10):在工作流中使用关联
2008-06-01 13:03 658[置顶]坚持学习WF文章索 ... -
坚持学习WF(11):工作流通信与队列
2008-06-07 15:45 692[置顶]坚持学习WF文章索引 WF 提供的通信模型是构建于 ... -
MOSS中创建自定义内容类型
2008-06-12 20:23 1068一:简要介绍 某类内容 ... -
.NET中IDisposable接口的基本使用
2008-06-15 12:01 908首先来看MSDN中关于这个接口的说明: [ComVisible ... -
坚持学习WF(12):使用EventHandlingScopeActivity活动
2008-06-18 22:46 639[置顶]坚持学习WF文章索引 EventHandlingSco ...
相关推荐
坚持学习WF(1):从HelloWorld开始 本文主要通过实现了一个可以接受参数的HelloWorld程序来了解WF。 坚持学习WF(2):WF创作模式和设计时工具 坚持学习WF(3):WF框架概览 ...坚持学习WF(9):本地服务之事件处理
坚持学习WF(9):本地服务之事件处理 工作流能够使用方法和事件通过消息与宿主程序交互。 事件用于将数据发送到工作流,而工作流使用方法将数据发送到主机应用程序,8.9两篇主要说了本地服务如何调用外部方法和接收...
坚持学习WF(8):本地服务之调用外部方法 坚持学习WF(9):本地服务之事件处理 工作流能够使用方法和事件通过消息与宿主程序交互。 事件用于将数据发送到工作流,而工作流使用方法将数据发送到主机应用程序,8.9两篇...
坚持学习WF(1):从HelloWorld开始 源码
坚持学习WF(5):自定义活动(CustomActivity) 源码
Beginning WF: Windows Workflow in .NET 4.0 By Mark Collins Publisher: Apress 2010 | 500 Pages | ISBN: 1430224851 | PDF | 4 MB Windows Workflow Foundation is a ground-breaking addition to the core ...
WF5803/WF100D驱动代码及资料,包含IIC、三线SPI、四线SPI驱动代码
微软工作流的学习的文档微软工作流的学习的文档微软工作流的学习的文档微软工作流的学习的文档微软工作流的学习的文档微软工作流的学习的文档微软工作流的学习的文档微软工作流的学习的文档微软工作流的学习的文档...
workflow study step by step ,英语原版,WF学习从入门到提高
爱普生WF-7620 WF-7610 WF-7110 WF-3641等喷头更换视频教程。很详细的视频教程。
Beginning WF Windows Workflow in .NET 4.0
Pro WF4.5 学习最新WF必备资料 WF4.5对前一个版本做了很多改进,资料为英文版,请按需下载。
Chapter 9: Communicating with the Host Application........................................123 Chapter 10: Web Services....................................................................................
Windows Workflow Foundation (WF) is a revolutionary part of the .NET 4 Framework that allows you to orchestrate human and system interactions as a series of workflows that can be easily mapped, ...
WF从入门到精通(第十章):事件活动源码
WF是微软在.NET 3.0上推出的三大框架(WPF和WCF及WF)之一,其主要目的在于为现有的.NET应用程序嵌入工作流应用,目前最新的.NET 4.5版本已经完美集成了WF功能。WF不是一个独立的工作流应用程序,它提供了一些类库...
WF4.0基础篇学习笔记,很好的资料文档,下载不后悔
WF40 实战:实现自动访问网站机器人.doc
Beginning WF Beginning WF demonstrates, in an eminently readable and accessible style, how Microsoft's Workflow Foundation (WF) technology can be used in a wide variety of applications. This book will...
wince wf