开发者

dynamic load recive activity wf

I'm trying to load and invoke activityes from custom activity as follows:

Imagine I have a xamlx like this:

--Sequence |----- LoadActiviy |--Initialize dictionary with input data of activitity |----- Invoke

This works when activity NOT CONTAINS receive/send messages. But when i try with activity wich contains receive/send messages the result is a exception

WorkflowApplicationUnhandledExceptionEventArgs: Only registered bookmark scopes can be used for creating scoped bookmarks.

The code:

1-Load xaml: (Load activity)

public sealed class LoadActivity : CodeActivity<Activity>
    {
        #region Properties

        /// <summary>
        /// Gets or sets Path.
        /// </summary>
        [RequiredArgument]
        public InArgument<string> Path { get; set; }

        #endregion

        #region Methods

        /// <summary>
        /// The execute method.
        /// </summary>
        /// <param name="context">
        /// The context.
        /// </param>
        /// <returns>
        /// An activity loaded from a file
        /// </returns>
        protected override Activity Execute(CodeActivityContext context)
        {
            return ActivityXamlServices.Load(this.Path.Get(context));
        }

        #endregion
    }

2- Run activity:

  public class SynchronousSynchronizationContext : SynchronizationContext
    {
        public override void Post(SendOrPostCallback d, object state)
        {

            d(state);
        }
    }

public sealed class Invoke : CodeActivity
    {
        #region Properties

        /// <summary>
        ///   Gets or sets Activity.
        /// </summary>
        /// <remarks>
        ///   The activity that will be invoked.  Can be loaded from XAML.
        /// </remarks>
        [RequiredArgument]
        public InArgument<Activity> Activity { get; set; }
        public OutArgument<IDictionary<string, object>> Output { get; set; }

        /// <summary>
        ///   Gets or sets In开发者_JAVA百科put.
        /// </summary>
        /// <remarks>
        ///   The input arguments you want to pass to the other workflow
        /// </remarks>
        public InArgument<IDictionary<string, object>> Input { get; set; }


        #endregion

        // If your activity returns a value, derive from CodeActivity<TResult>
        // and return the value from the Execute method.
        protected override void Execute(CodeActivityContext context)
        {
            try
            {
                IDictionary<string,object> _input= this.Input.Get(context);

                foreach (KeyValuePair<string,object> item in   _input )
                {
                    Debug.WriteLine(string.Format("{0} {1}", item.Key, item.Value));
                }

                //  AutoResetEvent idleEvent = new AutoResetEvent(false);
                WorkflowApplication app = new WorkflowApplication(this.Activity.Get(context),this.Input.Get(context));


                app.SynchronizationContext = new SynchronousSynchronizationContext();
                app.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
                {
                 //   idleEvent.Set();
                };


                app.OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e)
                {
                    // Display the unhandled exception.
                    Console.WriteLine("OnUnhandledException in Workflow {0}\n{1}",
                        e.InstanceId, e.UnhandledException.Message);

                    Console.WriteLine("ExceptionSource: {0} - {1}",
                        e.ExceptionSource.DisplayName, e.ExceptionSourceInstanceId);

                    // Instruct the runtime to terminate the workflow.
                    // Other choices are Abort and Cancel. Terminate
                    // is the default if no OnUnhandledException handler
                    // is present.
                    return UnhandledExceptionAction.Terminate;
                };



                app.Idle = e => Console.WriteLine("WorkflowApplication.Idle called");

                Console.WriteLine("Before WorkflowApplication.Run()");

                app.Run();


            }
            catch 
            {
                throw;
            }

        }
    }

Any ideas?


You can only use a Receive activity in a workflow hosted in a WorkflowServiceHost. Even if your main workflow is hosted in a WorkflowServiceHost the child workflow is hosted in a WorkflowApplication and can't contain a Receive activity because it isn't running as part of the WCF infrastructure.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜