Windows Workflow开发演练

 

Windows Workflow 开发演练
 

 
Visual Studio 2005 中的工作流项目类型
l          顺序工作流控制台应用程序 (Sequential Workflow Console Application):创建用于生成工作流的项目,该工作流包含一个默认的顺序工作流和一个控制台测试宿主应用程序。
l          顺序工作流库 (Sequential Workflow Library):创建用于以库的形式生成顺序工作流的项目。
l          工作流活动库 (Workflow Activity Library):创建一个用来创建活动的库的项目,以后可以将其作为工作流应用程序中的构造块重用。
l          状态机控制台应用程序 (State Machine Console Application):创建用于生成状态机工作流和控制台宿主应用程序的项目。
l          状态机工作流库 (State Machine Workflow Library):创建用于以库的形式生成状态机工作流的项目。
这个例子我们完成一个最基础的工作流,在控制台上显示一些此工作流自身的信息。
这个练习我们学习工作流相关的基本操作。
 
新建项目,选择“顺序工作流控制台应用程序”:
从工具箱中拖一个 到设计器:
填写代码:
选择codeActivity1,点属性页,ExecuteCode属性输入方法名称showInfo,双击方法名,Visual studio自动生成方法代码框架,
填写代码:
    public sealed partial class Workflow1: SequentialWorkflowActivity
    {
……
        private void showInfo( object sender, EventArgs e)
        {
            CodeActivity c = (CodeActivity)sender;
            Console .WriteLine("Hello, from '{0}'./nI'm an instance of the {1} class.",
               c.Name, c.ToString());
            Console.ReadLine();
        }
    }
运行可以看到:
这个例子我们实现一个工作流,弹出消息框,显示从主程序接收到的数据。
这个练习我们学习如何通过参数传递数据到工作流。
 
让我们继续分析并修改该工作流,以使其在实例化以后接收和使用数据。有两种在实例化工作流以后使其接收数据的常规方法:参数和事件。如果选择使用参数,则需要在可视化设计器中手动定义参数名称和类型的列表。如果选择使用事件,则需要创建并添加一个自定义活动(该活动充当在工作流模型中的某个位置介入的外部源),并且传入一些数据。首先我们学习参数的使用,后面我们将说明基于事件的方法。
首先为 Workflow1 添加属性 FirstName LastName
    public sealed partial class Workflow1: SequentialWorkflowActivity
    {
       ……
        private string _FirstName;
        public string FirstName
        {
            get { return _FirstName; }
            set { _FirstName = value; }
        }
        //{
        //    数据可以保存到 UserData 中,如下:
        //    get { return (string)UserData["FirstName"];}
        //    set { UserData["FirstName"] = value; }
        //}
 
        private string _LastName;
        public string LastName
        {
            get { return _LastName; }
            set { _LastName = value; }
        }
……
}
 
在解决方案中新建一个 windows 应用程序 WinFormHost ,设计主窗体如下:
添加引用:
生成 tbStartWorkflow_Click 事件并填写代码(代码可以从 WorkflowConsoleApplication program.cs 中复制得到 ):
using System.Windows.Forms;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
 
namespace WinFormHost
{
    public partial class Form1 : Form
    {
……
        private void tbStartWorkflow_Click(object sender, EventArgs e)
        {
            using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
            {
                AutoResetEvent waitHandle = new AutoResetEvent(false);
                workflowRuntime.WorkflowCompleted += delegate(object sender1, WorkflowCompletedEventArgs e1) { waitHandle.Set(); };
                workflowRuntime.WorkflowTerminated += delegate(object sender1, WorkflowTerminatedEventArgs e1)
                {
                    Console.WriteLine(e1.Exception.Message);
                    waitHandle.Set();
                };
 
                Dictionary<string, object> parameters = new Dictionary<string, object>();
                parameters.Add("FirstName", tbFirstName.Text);
                parameters.Add("LastName", tbLastName.Text);
                WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication6.Workflow1), parameters);
                instance.Start();
 
                waitHandle.WaitOne();
            }
        }
    }
}
修改 Workflow1 的代码如下:
    public sealed partial class Workflow1: SequentialWorkflowActivity
    {
      ……
        private void showInfo(object sender, EventArgs e)
        {
            System.Windows.Forms.MessageBox.Show("Welcome, " + FirstName + " " + LastName);
        }
    }
运行 WinFormHost:
这个例子中我们写一个自动发送Mail的工作流,其中发送Mail由我们自定义的一个Activity实现。
这个练习我们学习如何实现自定义活动。
 
首先新建一个工作流Activity 库:SendMail
改名:
定义属性: To From Subject Body Host ,改写方法 Execute:
    public partial class SendMailActivity: SequenceActivity
    {
        public String To
        {
            get { return _To; } set { _To = value; }
        }
        public String From
        {……}
        public String Subject
        {……}
        public String Body
        {……}
        public String Host
        {……}
 
        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            MailAddress toAddress = new MailAddress(To);
            MailAddress fromAddress = new MailAddress(From);
 
            MailAddressCollection addresses = new MailAddressCollection();
            addresses.Add(toAddress);
 
            MailMessage msg = new MailMessage(fromAddress, toAddress);
            msg.Subject = Subject;
            msg.Body = Body;
 
            SmtpClient mail = new SmtpClient(Host);
            mail.Credentials = new NetworkCredential("[email protected]", " 保密,呵呵 " );
// SMTP 服务器需要身份验证
            mail.Send(msg);
           
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值