首页 > 编程开发 > Objective-C编程 >
-
通过AEC解读WF的核心原理(3)Excute方法Activity的入口
Execute方法Activity的入口
Activity的Execute就跟应用程序的Main一样,是入口函数,由加载者自动调用,入口函数的格是一个与加载者契约,不能修改
先看一下应用程序的入口函数,我用了一个有返回值的入口函数,这是与常用的 static void Main()有些不同,是入口函数的另一个版本
class Program
{
//一个的返回值的入口函数
static int Main()
{
System.Console.WriteLine("wxwinter");
return 0; //返回给调用者
}
}
运行结果
再看一下Activity的入口函数
//自定义Activity
public class myActivity : Activity
{
protected override ActivityExecutionStatus Execute(ActivityExecutionContext eac)
{
System.Console.WriteLine("wxwinter");
return ActivityExecutionStatus.Closed;
}
}
//宿主
class Program
{
static void Main()
{
WorkflowRuntime workflowRuntime = new WorkflowRuntime();
workflowRuntime.WorkflowCompleted +=new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);
workflowRuntime.WorkflowIdled += new EventHandler<WorkflowEventArgs>(workflowRuntime_WorkflowIdled);
WorkflowInstance ins= workflowRuntime.CreateWorkflow(typeof(myActivity));
ins.Start();
System.Console.Read();
}
static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)
{
System.Console.WriteLine("WorkflowIdled");
}
static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
System.Console.WriteLine("WorkflowCompleted");
}
}
编缉推荐阅读以下文章
- 暂无相关文章
我创建了一个Activity,并将它直接交给引擎,由引擎创建实例,当实例Start时,Execute被执行,当Execute返回Closed时流程完成
Activity的生命周期 初始化
生看一下应用程序
入口函数并不是第一个被执行的,第一个被执行的是静态构造函数
class Program
{
static Program()
{
System.Console.WriteLine("静态构造函数");
}
Program()
{
//在本例中由于没有 new 过Program,不会被执行
System.Console.WriteLine("构造函数");
}
//一个的返回值的入口函数
static int Main()
{
System.Console.WriteLine("wxwinter");
return 0; //返回给调用者
}
}
再看一下Activity
//自定义Activity
public class myActivity : Activity
{
protected override void Initialize(IServiceProvider provider)
{
System.Console.WriteLine("Initialize");
base.Initialize(provider);
}
protected override ActivityExecutionStatus Execute(ActivityExecutionContext eac)
{
System.Console.WriteLine("wxwinter");
return ActivityExecutionStatus.Closed;
}
}
//宿主
class Program
{
static void Main()
{
WorkflowRuntime workflowRuntime = new WorkflowRuntime();
workflowRuntime.WorkflowCompleted +=new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);
workflowRuntime.WorkflowIdled += new EventHandler<WorkflowEventArgs>(workflowRuntime_WorkflowIdled);
WorkflowInstance ins= workflowRuntime.CreateWorkflow(typeof(myActivity));
ins.Start();
System.Console.Read();
}
static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)
{
System.Console.WriteLine("WorkflowIdled");
}
static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
System.Console.WriteLine("WorkflowCompleted");
}
}
编缉推荐阅读以下文章
- 暂无相关文章
在Activity中,就更明显了,Initialize在实例创建时就被调用,Execute只是在才被调用,这里有一点要注意,构造函数是隐示调用基类的构造函数,
Initialize要显示调用基类的Initialize
应用程序与Activity的生命周期都是:
开始准备 -> 准备完成 -> 开始执行 -> 完成关闭
(这里我们先不谈Activity的Canceling,Compensating,Faulting 以及析构与回收)
执行完成的标记
先看一下应用程序
class Program
{
static int Main()
{
test();
System.Console.Read();
return 0;
}//注意这个花括号
static void test()
{
System.Console.WriteLine("wxwinter");
System.Threading.Thread.Sleep(1000);
System.Console.WriteLine("lzm");
System.Threading.Thread.Sleep(1000);
System.Console.WriteLine("wxd");
System.Threading.Thread.Sleep(1000);
}
}
如果你清楚的知道程序地内存栈中的工作方式,你就会知道"{" 与 "}" 的含意
入口函数的"{" 与 "}" 包含程序的全部生命周期,一般我们认为入口函数的 "}"完成,程序就完成了,其实还有一个工作要做,就是从 "}"向
编缉推荐阅读以下文章
- 暂无相关文章
"{"出栈,当然这是由管理器来做的,所以入口函数的 "}"就是执行完成的标记
看一下Activity,[return ActivityExecutionStatus.Closed]就是执行完成的标记
protected override ActivityExecutionStatus Execute(ActivityExecutionContext eac)
{
return ActivityExecutionStatus.Closed;
}
现在有个问题,如果在[入口函数]或Execute中调用了其它线程怎么办
看一下的程序实现方式
class Program
{
static System.Threading.AutoResetEvent waitHandle = new System.Threading.AutoResetEvent(false);
static int Main()
{
System.Threading.Thread th = new System.Threading.Thread(test);
th.Start();
waitHandle.WaitOne();
return 0;
}
static void test()
{
System.Console.WriteLine("wxwinter");
System.Threading.Thread.Sleep(1000);
System.Console.WriteLine("lzm");
System.Threading.Thread.Sleep(1000);
System.Console.WriteLine("wxd");
System.Threading.Thread.Sleep(1000);
waitHandle.Set();
}
}
waitHandle就是一个待标记,Activity使用的是ActivityExecutionStatus.Executing;
看一下例子
//自定义Activity
public class myActivity : Activity
{
protected override ActivityExecutionStatus Execute(ActivityExecutionContext eac)
{
test();
return ActivityExecutionStatus.Executing;
}
void test()
{
System.Console.WriteLine("wxwinter");
}
}
//宿主
class Program
{
static void Main()
{
WorkflowRuntime workflowRuntime = new WorkflowRuntime();
workflowRuntime.WorkflowCompleted +=new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);
workflowRuntime.WorkflowIdled += new EventHandler<WorkflowEventArgs>(workflowRuntime_WorkflowIdled);
WorkflowInstance ins= workflowRuntime.CreateWorkflow(typeof(myActivity));
ins.Start();
System.Console.Read();
}
static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)
{
System.Console.WriteLine("WorkflowIdled");
}
static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
System.Console.WriteLine("WorkflowCompleted");
}
}
编缉推荐阅读以下文章
- 暂无相关文章
ActivityExecutionStatus.Executing标记Activity进入等执行等待
ActivityExecutionStatus.Closed标记Activity完成
现在还的一个问题,如何将ActivityExecutionStatus.Executing设为ActivityExecutionStatus.Closed
可以用Activity的方法Invoke与ActivityExecutionContext的CloseActivity方法实现
看例子
//自定义Activity
public class myActivity : Activity
{
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
this.Invoke(test, new EventArgs());
return ActivityExecutionStatus.Executing;
}
void test(object sender, EventArgs e)
{
System.Console.WriteLine("wxwinter");
ActivityExecutionContext aec = sender as ActivityExecutionContext;
aec.CloseActivity(); //将Activity的执行状态设为Closed
}
}
//宿主
class Program
{
static void Main()
{
WorkflowRuntime workflowRuntime = new WorkflowRuntime();
workflowRuntime.WorkflowCompleted +=new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);
workflowRuntime.WorkflowIdled += new EventHandler<WorkflowEventArgs>(workflowRuntime_WorkflowIdled);
WorkflowInstance ins= workflowRuntime.CreateWorkflow(typeof(myActivity));
ins.Start();
System.Console.Read();
}
static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)
{
System.Console.WriteLine("WorkflowIdled");
}
static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
System.Console.WriteLine("WorkflowCompleted");
}
}
总结:
ACE提供了将Activity设为ActivityExecutionStatus.Closed的实现
编缉推荐阅读以下文章
- 暂无相关文章
我创建了一个Activity,并将它直接交给引擎,由引擎创建实例,当实例Start时,Execute被执行,当Execute返回Closed时流程完成
Activity的生命周期 初始化
生看一下应用程序
入口函数并不是第一个被执行的,第一个被执行的是静态构造函数
class Program
{
static Program()
{
System.Console.WriteLine("静态构造函数");
}
Program()
{
//在本例中由于没有 new 过Program,不会被执行
System.Console.WriteLine("构造函数");
}
//一个的返回值的入口函数
static int Main()
{
System.Console.WriteLine("wxwinter");
return 0; //返回给调用者
}
}
再看一下Activity
//自定义Activity
public class myActivity : Activity
{
protected override void Initialize(IServiceProvider provider)
{
System.Console.WriteLine("Initialize");
base.Initialize(provider);
}
protected override ActivityExecutionStatus Execute(ActivityExecutionContext eac)
{
System.Console.WriteLine("wxwinter");
return ActivityExecutionStatus.Closed;
}
}
//宿主
class Program
{
static void Main()
{
WorkflowRuntime workflowRuntime = new WorkflowRuntime();
workflowRuntime.WorkflowCompleted +=new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);
workflowRuntime.WorkflowIdled += new EventHandler<WorkflowEventArgs>(workflowRuntime_WorkflowIdled);
WorkflowInstance ins= workflowRuntime.CreateWorkflow(typeof(myActivity));
ins.Start();
System.Console.Read();
}
static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)
{
System.Console.WriteLine("WorkflowIdled");
}
static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
System.Console.WriteLine("WorkflowCompleted");
}
}