工作流学习过程-开篇
最近由于项目原因,比较闲,闲暇时间学习了下工作流方面的知识。版本为3.5
学习资料为wf高级程序设计
感觉书里内容比较基础、层次很清晰、代码全,非常适合工作流入门学习
先来看看什么是工作流?
流就是处理一件事情的步骤喽,那工作流就是要完成某项工作的步骤集合了(个人理解)
由于本人水平很哇。故不能提供代码的解释部分,紧提供实例及代码
例1.计算器
运行时效果如图所示
根据实际需要若完成该计算器的功能
1-0 10个数字的Click事件应该相应同一个事件btnNum_Click
+-*/四个运算符号Click事件应该响应同一个事件btnOperator_Click
= 和 C 各为一个事件btnEqual_Click和btnClear_Click
实现代码如下。写的比较烂
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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)
那我们如何来使用工作流来完成此项工作呢
来看看工作流如图:
后台代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 代码修改如下即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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一样的东西了