public virtual IProcessInstance Execute(CommandContext commandContext) { var processEngineConfiguration = context.Impl.Context.ProcessEngineConfiguration; DeploymentCache deploymentCache = processEngineConfiguration.DeploymentCache; ProcessDefinitionEntity processDefinition = deploymentCache.FindDeployedProcessDefinitionById(ProcessDefinitionId); EnsureUtil.EnsureNotNull("No process definition found for id = '" + ProcessDefinitionId + "'", "processDefinition", processDefinition); foreach (var checker in commandContext.ProcessEngineConfiguration.CommandCheckers) { checker.CheckCreateProcessInstance(processDefinition); } ExecutionEntity processInstance = null; if (!ReferenceEquals(BusinessKey, null)) { processInstance = (ExecutionEntity)processDefinition.CreateProcessInstance(BusinessKey); } else { processInstance = (ExecutionEntity)processDefinition.CreateProcessInstance(); } //if the start event is async, we have to set the variables already here //since they are lost after the async continuation otherwise if (processDefinition.Initial.AsyncBefore) { // avoid firing history events processInstance.StartContext = new ProcessInstanceStartContext(processInstance.Activity as ActivityImpl); FormPropertyHelper.InitFormPropertiesOnScope(Variables, processInstance); processInstance.Start(); } else { processInstance.StartWithFormProperties(Variables); } return((IProcessInstance)processInstance); }