首页 > 编程开发 > Objective-C编程 >
-
通过AEC解读WF的核心原理(10)取消和取消处理器
说明
例子下载:
http://files.cnblogs.com/wxwinter/aec10_1.rar
http://files.cnblogs.com/wxwinter/aec10_2.rar
取消的实现
取消处理器CancellationHandlerActivity的使用
例子:取消 内容控件Activity
public class 内容控件: Activity
{
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
this.Invoke(正常业务, new EventArgs());
return ActivityExecutionStatus.Executing;
}
protected override ActivityExecutionStatus Cancel(ActivityExecutionContext executionContext)
{
System.Console.WriteLine("取消");
this.Invoke(取消业务, new EventArgs());
return ActivityExecutionStatus.Canceling;
// return ActivityExecutionStatus.Closed;
}
void 正常业务(object sender, EventArgs e)
{
System.Console.WriteLine("wxwinter");
ActivityExecutionContext aec = sender as ActivityExecutionContext;
aec.CloseActivity();
}
void 取消业务(object sender, EventArgs e)
{
//用于处理取消是否恢复的业务
ActivityExecutionContext aec = sender as ActivityExecutionContext;
aec.CloseActivity();
}
}
容器控件Activity
public class 容器控件: SequenceActivity
{
public 容器控件()
{
InitializeComponent();
}
[System.Diagnostics.DebuggerNonUserCode]
private void InitializeComponent()
{
this.CanModifyActivities = true;
this.内容控件1 = new wxwinterAecTest.内容控件();
this.内容控件1.Name = "内容控件1";
this.Activities.Add(this.内容控件1);
this.CanModifyActivities = false;
}
private 内容控件 内容控件1;
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
this.内容控件1.Closed += activity11_Closed;
this.内容控件1.Executing+=new EventHandler<ActivityExecutionStatusChangedEventArgs>(activity11_Executing);
executionContext.ExecuteActivity(this.内容控件1);
return ActivityExecutionStatus.Executing;
}
bool IsCancel = false;
void activity11_Executing(object sender, ActivityExecutionStatusChangedEventArgs e)
{
IsCancel = true; //一个模拟要取消的业务情形
if (IsCancel)
{
ActivityExecutionContext aec = sender as ActivityExecutionContext;
aec.CancelActivity(this.内容控件1);
}
}
void activity11_Closed(object sender, ActivityExecutionStatusChangedEventArgs e)
{
e.Activity.Closed -= activity11_Closed;
ActivityExecutionContext aec = sender as ActivityExecutionContext;
aec.CloseActivity();
}
}
测试用工作流
public class Workflow1: SequentialWorkflowActivity
{
private 容器控件 容器控件1;
public Workflow1()
{
InitializeComponent();
}
[System.Diagnostics.DebuggerNonUserCode]
private void InitializeComponent()
{
this.CanModifyActivities = true;
this.容器控件1 = new wxwinterAecTest.容器控件();
//
// 容器控件1
//
this.容器控件1.Name = "容器控件1";
//
// Workflow1
//
this.Activities.Add(this.容器控件1);
this.Name = "Workflow1";
this.CanModifyActivities = false;
}
}
宿主
class Program
{
static void Main()
{
WorkflowRuntime workflowRuntime = new WorkflowRuntime();
workflowRuntime.WorkflowCompleted +=new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);
workflowRuntime.WorkflowTerminated +=new EventHandler<WorkflowTerminatedEventArgs>(workflowRuntime_WorkflowTerminated);
workflowRuntime.WorkflowIdled+=new EventHandler<WorkflowEventArgs>(workflowRuntime_WorkflowIdled);
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Workflow1));
instance.Start();
System.Console.Read();
}
static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)
{
System.Console.WriteLine("WorkflowIdled");
}
static void workflowRuntime_WorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)
{
System.Console.WriteLine("Terminated" + e.Exception.Message);
}
static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
System.Console.WriteLine("WorkflowCompleted");
}
}
运行结果
IsCancel = true;
IsCancel = false
例子:取消处理器CancellationHandlerActivity 支持取消的控件Activity
public class 支持取消的控件 : SequenceActivity
{
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
this.EnabledActivities[0].Closed +=Activity_Closed;
executionContext.ExecuteActivity(this.EnabledActivities[0]);
return ActivityExecutionStatus.Executing;
}
void Activity_Closed(object sender, ActivityExecutionStatusChangedEventArgs e)
{
ActivityExecutionContext aec = sender as ActivityExecutionContext;
aec.CloseActivity();
}
protected override ActivityExecutionStatus Cancel(ActivityExecutionContext executionContext)
{
foreach (var v in this.Activities)
{
if (v is CancellationHandlerActivity)
{
v.Closed += CancellationHandlerActivity_Closed;
executionContext.ExecuteActivity(v);
return ActivityExecutionStatus.Canceling;
}
}
return ActivityExecutionStatus.Closed;
}
void CancellationHandlerActivity_Closed(object sender, ActivityExecutionStatusChangedEventArgs e)
{
ActivityExecutionContext aec = sender as ActivityExecutionContext;
aec.CloseActivity();
}
}
可取消的容器Activity
public class 可取消的容器 : SequenceActivity
{
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
this.EnabledActivities[0].Closed += activity_Closed;
this.EnabledActivities[0].Executing += activity_Executing;
executionContext.ExecuteActivity(this.EnabledActivities[0]);
return ActivityExecutionStatus.Executing;
}
public bool 是否取消 { get; set; }
void activity_Executing(object sender, ActivityExecutionStatusChangedEventArgs e)
{
if (是否取消)
{
ActivityExecutionContext aec = sender as ActivityExecutionContext;
aec.CancelActivity(this.EnabledActivities[0]);
}
}
void activity_Closed(object sender, ActivityExecutionStatusChangedEventArgs e)
{
e.Activity.Closed -= activity_Closed;
ActivityExecutionContext aec = sender as ActivityExecutionContext;
aec.CloseActivity();
}
}
测试用工作流
public class Workflow1: SequentialWorkflowActivity
{
private CodeActivity 正常路径业;
private 支持取消的控件 支持取消的控件1;
private CodeActivity 取消业务路径;
private CancellationHandlerActivity cancellationHandlerActivity1;
private 可取消的容器 可取消的容器1;
public Workflow1()
{
InitializeComponent();
}
[System.Diagnostics.DebuggerNonUserCode]
private void InitializeComponent()
{
this.CanModifyActivities = true;
this.取消业务路径 = new System.Workflow.Activities.CodeActivity();
this.cancellationHandlerActivity1 = new System.Workflow.ComponentModel.CancellationHandlerActivity();
this.正常路径业 = new System.Workflow.Activities.CodeActivity();
this.支持取消的控件1 = new wxwinterAecTest.支持取消的控件();
this.可取消的容器1 = new wxwinterAecTest.可取消的容器();
//
// 取消业务路径
//
this.取消业务路径.Name = "取消业务路径";
this.取消业务路径.ExecuteCode += new System.EventHandler(this.取消业务路径_ExecuteCode);
//
// cancellationHandlerActivity1
//
this.cancellationHandlerActivity1.Activities.Add(this.取消业务路径);
this.cancellationHandlerActivity1.Name = "cancellationHandlerActivity1";
//
// 正常路径业
//
this.正常路径业.Name = "正常路径业";
this.正常路径业.ExecuteCode += new System.EventHandler(this.正常路径业_ExecuteCode);
//
// 支持取消的控件1
//
this.支持取消的控件1.Activities.Add(this.正常路径业);
this.支持取消的控件1.Activities.Add(this.cancellationHandlerActivity1);
this.支持取消的控件1.Name = "支持取消的控件1";
//
// 可取消的容器1
//
this.可取消的容器1.Activities.Add(this.支持取消的控件1);
this.可取消的容器1.Name = "可取消的容器1";
this.可取消的容器1.是否取消 = true;
//
// Workflow1
//
this.Activities.Add(this.可取消的容器1);
this.Name = "Workflow1";
this.CanModifyActivities = false;
}
private void 正常路径业_ExecuteCode(object sender, EventArgs e)
{
System.Console.WriteLine("正常执行");
}
private void 取消业务路径_ExecuteCode(object sender, EventArgs e)
{
System.Console.WriteLine("取消执行");
}
}
宿主
class Program
{
static void Main()
{
WorkflowRuntime workflowRuntime = new WorkflowRuntime();
workflowRuntime.WorkflowCompleted +=new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);
workflowRuntime.WorkflowTerminated +=new EventHandler<WorkflowTerminatedEventArgs>(workflowRuntime_WorkflowTerminated);
workflowRuntime.WorkflowIdled+=new EventHandler<WorkflowEventArgs>(workflowRuntime_WorkflowIdled);
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Workflow1));
instance.Start();
System.Console.Read();
}
static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)
{
System.Console.WriteLine("WorkflowIdled");
}
static void workflowRuntime_WorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)
{
System.Console.WriteLine("Terminated" + e.Exception.Message);
}
static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
System.Console.WriteLine("WorkflowCompleted");
}
}
运行结果
容器控件Activity
public class 容器控件: SequenceActivity
{
public 容器控件()
{
InitializeComponent();
}
[System.Diagnostics.DebuggerNonUserCode]
private void InitializeComponent()
{
this.CanModifyActivities = true;
this.内容控件1 = new wxwinterAecTest.内容控件();
this.内容控件1.Name = "内容控件1";
this.Activities.Add(this.内容控件1);
this.CanModifyActivities = false;
}
private 内容控件 内容控件1;
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
this.内容控件1.Closed += activity11_Closed;
this.内容控件1.Executing+=new EventHandler<ActivityExecutionStatusChangedEventArgs>(activity11_Executing);
executionContext.ExecuteActivity(this.内容控件1);
return ActivityExecutionStatus.Executing;
}
bool IsCancel = false;
void activity11_Executing(object sender, ActivityExecutionStatusChangedEventArgs e)
{
IsCancel = true; //一个模拟要取消的业务情形
if (IsCancel)
{
ActivityExecutionContext aec = sender as ActivityExecutionContext;
aec.CancelActivity(this.内容控件1);
}
}
void activity11_Closed(object sender, ActivityExecutionStatusChangedEventArgs e)
{
e.Activity.Closed -= activity11_Closed;
ActivityExecutionContext aec = sender as ActivityExecutionContext;
aec.CloseActivity();
}
}