public void run()
        {
            if (this.State != ProcessInstanceEnum.INITIALIZED)
            {
                throw new EngineException(this.Id,
                        this.WorkflowProcess,
                        this.ProcessId, "The state of the process instance is " + this.State + ",can not run it ");
            }

            INetInstance netInstance = (INetInstance)this.RuntimeContext.KernelManager.getNetInstance(this.ProcessId, this.Version);
            if (netInstance == null)
            {
                throw new EngineException(this.Id,
                        this.WorkflowProcess,
                        this.ProcessId, "The net instance for the  workflow process [Id=" + this.ProcessId + "] is Not found");
            }
            //触发事件
            ProcessInstanceEvent pevent = new ProcessInstanceEvent();
            pevent.EventType = ProcessInstanceEventEnum.BEFORE_PROCESS_INSTANCE_RUN;
            pevent.Source=this;
            this.fireProcessInstanceEvent(pevent);

            this.State=ProcessInstanceEnum.RUNNING;
            this.StartedTime=this.RuntimeContext.CalendarService.getSysDate();
            this.RuntimeContext.PersistenceService.SaveOrUpdateProcessInstance(this);
            netInstance.run(this);
        }
        /// <summary>触发process instance相关的事件</summary>
        /// <param name="e"></param>
        protected void fireProcessInstanceEvent(ProcessInstanceEvent e)
        {
            WorkflowProcess workflowProcess = this.WorkflowProcess;
            if (workflowProcess == null)
            {
                return;
            }

            List<EventListener> listeners = workflowProcess.EventListeners;
            for (int i = 0; i < listeners.Count; i++)
            {
                EventListener listener = (EventListener)listeners[i];
                Object obj = this.RuntimeContext.getBeanByName(listener.ClassName);
                if (obj != null)
                {
                    ((IProcessInstanceEventListener)obj).onProcessInstanceEventFired(e);
                }
            }
        }
        /// <summary>
        /// <para>正常结束工作流</para>
        /// <para>1、首先检查有无活动的token,如果有则直接返回,如果没有则结束当前流程</para>
        /// <para>2、执行结束流程的操作,将state的值设置为结束状态</para>
        /// 3、然后检查parentTaskInstanceId是否为null,如果不为null则,调用父taskinstance的complete操作。
        /// </summary>
        public void complete()
        {
            List<IToken> tokens = this.RuntimeContext.PersistenceService.FindTokensForProcessInstance(this.Id, null);
            Boolean canBeCompleted = true;
            for (int i = 0; tokens != null && i < tokens.Count; i++)
            {
                IToken token = tokens[i];
                if (token.IsAlive)
                {
                    canBeCompleted = false;
                    break;
                }
            }
            if (!canBeCompleted)
            {
                return;
            }

            this.State=ProcessInstanceEnum.COMPLETED;
            //记录结束时间
            this.EndTime=this.RuntimeContext.CalendarService.getSysDate();
            this.RuntimeContext.PersistenceService.SaveOrUpdateProcessInstance(this);

            //删除所有的token
            for (int i = 0; tokens != null && i < tokens.Count; i++)
            {
                IToken token = tokens[i];
                this.RuntimeContext.PersistenceService.DeleteToken(token);
            }

            //触发事件
            ProcessInstanceEvent pevent = new ProcessInstanceEvent();
            pevent.EventType=ProcessInstanceEventEnum.AFTER_PROCESS_INSTANCE_COMPLETE;
            pevent.Source=this;
            this.fireProcessInstanceEvent(pevent);
            if ( !String.IsNullOrEmpty(this.ParentTaskInstanceId.Trim()))
            {
                ITaskInstance taskInstance = this.RuntimeContext.PersistenceService.FindAliveTaskInstanceById(this.ParentTaskInstanceId);
                ((IRuntimeContextAware)taskInstance).RuntimeContext=this.RuntimeContext;
                ((IWorkflowSessionAware)taskInstance).CurrentWorkflowSession = this.CurrentWorkflowSession;
                ((TaskInstance)taskInstance).complete(null);
            }
        }