public async Task <TResult> ExecuteTask <TResult>(string name, string version, params object[] parameters) { string serializedInput = dataConverter.Serialize(parameters); TaskActivity activity = objectManager.GetObject(name, version); Interlocked.Increment(ref pendingExecutions); string serializedResult = await Task.Factory.StartNew(() => { try { string result = activity.RunAsync(null, serializedInput).Result; return(result); } catch (AggregateException e) { e = e.Flatten(); if (e.InnerException is TaskFailureException) { var taskFailureException = e.InnerException as TaskFailureException; Exception cause = Utils.RetrieveCause(taskFailureException.Details, dataConverter); throw new TaskFailedException(0, 0, name, version, taskFailureException.Message, cause); } throw new TaskFailedException(0, 0, name, version, e.Message, e); } finally { Interlocked.Decrement(ref pendingExecutions); } }); var r = dataConverter.Deserialize <TResult>(serializedResult); return(r); }
async Task <T> Execute <T>(FakeOrchestrationContext context, string name, string version, object input) { OrchestrationInstance instance = context.OrchestrationInstance; SynchronizationContext prevCtx = SynchronizationContext.Current; try { TaskOrchestration definition = orchestrationObjectManager.GetObject(name, version); if (definition == null) { throw new OrchestrationFrameworkException("Orchestration not found"); } string serializedInput = dataConverter.Serialize(input); Task <string> serializedResultTask = definition.Execute(context, serializedInput); currentExecutions.Add(instance.InstanceId, definition); string serializedResult = null; try { serializedResult = await serializedResultTask; } catch (OrchestrationFailureException e) { Exception cause = Utils.RetrieveCause(e.Details, dataConverter); var subOrchestrationFailedException = new SubOrchestrationFailedException(0, 0, name, version, e.Message, cause); throw subOrchestrationFailedException; } catch (Exception e) { var subOrchestrationFailedException = new SubOrchestrationFailedException(0, 0, name, version, e.Message, e); throw subOrchestrationFailedException; } return(dataConverter.Deserialize <T>(serializedResult)); } finally { SynchronizationContext.SetSynchronizationContext(prevCtx); TaskOrchestration orchestration = null; if (currentExecutions.TryGetValue(instance.InstanceId, out orchestration)) { currentExecutions.Remove(instance.InstanceId); completedExecutions.Add(instance, orchestration); } } }