工作流学习过程-开篇

最近由于项目原因,比较闲,闲暇时间学习了下工作流方面的知识。版本为3.5
学习资料为wf高级程序设计
感觉书里内容比较基础、层次很清晰、代码全,非常适合工作流入门学习
先来看看什么是工作流?
流就是处理一件事情的步骤喽,那工作流就是要完成某项工作的步骤集合了(个人理解)
由于本人水平很哇。故不能提供代码的解释部分,紧提供实例及代码

例1.计算器
运行时效果如图所示

根据实际需要若完成该计算器的功能
1-0 10个数字的Click事件应该相应同一个事件btnNum_Click
+-*/四个运算符号Click事件应该响应同一个事件btnOperator_Click
= 和 C 各为一个事件btnEqual_Click和btnClear_Click
实现代码如下。写的比较烂

代码
private int num1, num2;
private string opera;
private double result = 0;

private void btnEqual_Click(object sender, EventArgs e)
{
num2
= int.Parse(txt.Text);
switch (opera)
{
case "+":
result
= num1 + num2;
break;
case "-":
result
= num1 - num2;
break;
case "*":
result
= num1 * num2;
break;
case "/":
if (num2 == 0)
throw new ArgumentException("被除数为0");
result
= num1 / num2;
break;
default:
throw new ArgumentException("错误的操作符");
break;
}
txt.Text
= result.ToString();
}

private void btnClear_Click(object sender, EventArgs e)
{
this.txt.Text = string.Empty;
}

private void btnNum_Click(object sender, EventArgs e)
{
Button btn
= sender as Button;
this.txt.AppendText(btn.Text);
}

private void btnOperator_Click(object sender, EventArgs e)
{
num1
= int.Parse(txt.Text);
txt.Text
= string.Empty;
Button btn
= sender as Button;
opera
= btn.Text;
}

一个简单的计算器功能就基本完成了。。当然了这里有很多bug的。。要按最正确的方式使用(:-D)
那我们如何来使用工作流来完成此项工作呢
来看看工作流如图:

后台代码如下:

代码
public sealed partial class CalculatorWorkflowActivity : SequentialWorkflowActivity
{
public CalculatorWorkflowActivity()
{
InitializeComponent();
}

public int Num1 { get; set; }
public int Num2 { get; set; }
public string Operator { get; set; }
public double Result { get; set; }

private void Add_ExecuteCode(object sender, EventArgs e)
{
Result
= Num1 + Num2;
}

private void Sub_ExecuteCode(object sender, EventArgs e)
{
Result
= Num1 - Num2;
}

private void Mul_ExecuteCode(object sender, EventArgs e)
{
Result
= Num1 * Num2;
}

private void Div_ExecuteCode(object sender, EventArgs e)
{
if (Num2 == 0)
throw new ArgumentException("除数为0");
Result
= (double)Num1 / (double)Num2;
}

private void Fault_ExecuteCode(object sender, EventArgs e)
{
throw new ArgumentException("无效的操作符");
}
}

那么我们的应用程序又如何来使用它呢
只需将btnEqual_Click 代码修改如下即可

 

代码
private void btnEqual_Click(object sender, EventArgs e)
{
num2
= int.Parse(txt.Text);
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(
"Num1", num1);
parameters.Add(
"Num2", num2);
parameters.Add(
"Operator", opera);

WorkflowInstance instance
= workflowRuntime.CreateWorkflow(typeof(CalculatorWorkflowActivity), parameters);
instance.Start();
waitHandle.WaitOne();
txt.Text
= result.ToString();
}
}

试运行。。结果呢?运行结果在哪里?

我们知道result现在应该是个空值,即使将值赋予txt控件也无济于事~

原来workflowRuntime的WorkflowCompleted事件提供的参数WorkflowCompletedEventArgs里的属性OutputParameters提供了提取操作结果的功能

只需在事件中将加入如下代码即可

result = (double)(e1.OutputParameters["Result"]);

 再运行即可得到和我们之前windowsForm一样的东西了

posted on 2010-10-22 16:08  gotolovo  阅读(208)  评论(0编辑  收藏  举报