现在的位置: 首页 > 综合 > 正文

通过AEC解读WF的核心原理(十)取消与取消处理器

2012年09月01日 ⁄ 综合 ⁄ 共 7697字 ⁄ 字号 评论关闭

说明

例子下载:

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");

}

 

}

 

运行结果

 

 

 

 

抱歉!评论已关闭.