public static void ProcessAsync(ShellTask taskInfo)
 {
     var task = new Task((taskInfoObject) =>
     {
         var shellTask = (ShellTask)taskInfoObject;
         ProcessAsyncShellTask(shellTask);
         return;
     }, taskInfo);
     task.Start();
 }
        private static void ProcessAsyncShellTask(ShellTask shellTask)
        {
            // Force reloading extensions if there were extensions installed
            // See http://orchard.codeplex.com/workitem/17465
            //if (shellTask.MessageName == "IRecipeSchedulerEventHandler.ExecuteWork")
            //{
            //    var ctx = _orchardHost().GetShellContext(entry.ShellSettings);
            //}

            var shellContext = shellTask.ShellContextFactory.CreateDescribedContext(shellTask.ShellSettings, shellTask.ShellDescriptor);
            using (shellContext.LifetimeScope)
            {
                using (var standaloneEnvironment = shellContext.LifetimeScope.CreateWorkContextScope())
                {

                    ILogger logger = NullLogger.Instance;
                    ITransactionManager transactionManager;
                    if (!standaloneEnvironment.TryResolve(out transactionManager))
                        transactionManager = null;

                    try
                    {


                        foreach (var interfaceType in shellTask.ShellAction.Method.DeclaringType.GetInterfaces())
                        {
                            string methodKey = String.Format("{0}_{1}_{2}", shellTask.ShellAction.GetType().FullName, shellTask.ShellAction.Method.DeclaringType, shellTask.ShellAction.Method.Name);
                            MethodInfo method;
                            if (!_interfaceMethodsCache.TryGetValue(methodKey, out method))
                            {
                                var m = (from o in interfaceType.GetMethods()
                                         where o.Name == shellTask.ShellAction.Method.Name
                                         && o.GetParameters().Length == 1
                                         && shellTask.ShellData.GetType().IsAssignableFrom(o.GetParameters()[0].ParameterType)
                                         select o).First();

                                method = _interfaceMethodsCache.GetOrAdd(methodKey, m);
                            }
                            if (method != null)
                            {

                                //DynamicMethod dynamic = new DynamicMethod(string.Empty,
                                //typeof(object),
                                //new Type[0],
                                //target.DeclaringType);
                                //ILGenerator il = dynamic.GetILGenerator();
                                //il.DeclareLocal(target.DeclaringType);
                                //il.Emit(OpCodes.Newobj, target);
                                //il.Emit(OpCodes.Stloc_0);
                                //il.Emit(OpCodes.Ldloc_0);
                                //il.Emit(OpCodes.Ret);
                                //var y = new { }.ActLike(interfaceType);

                                //Works
                                //IBlockModelService bms;
                                //if (standaloneEnvironment.TryResolve(out bms))
                                //    bms.ProcessModel(shellTask.ShellData);

                                //dynamic x = new ExpandoObject();
                                //x.i = Activator.CreateInstance(InterfaceHelper.ClassBuilder.Build(interfaceType));
                                //dynamic o  = x.i;


                                object obj;
                                if (Autofac.ResolutionExtensions.TryResolve(shellContext.LifetimeScope, interfaceType, out obj))
                                    method.Invoke(obj, new object[] { shellTask.ShellData });
                                return;
                            }


                        }

                        throw new NotSupportedException("Could not invoke (missing) long running concurrent method using IoC.");

                    }
                    catch
                    {
                        throw;
                    }
                    finally
                    {
                        // any database changes in this using(env) scope are invalidated
                        if (transactionManager != null)
                            transactionManager.Cancel();
                    }
                }
            }
        }