динамическая нагрузка восстанавливает активность wf - PullRequest
0 голосов
/ 07 октября 2011

Я пытаюсь загрузить и вызвать действия из пользовательских действий следующим образом:

Представьте, что у меня есть xamlx:

- Последовательность | ----- LoadActiviy | - Инициализировать словарь с входными данными активности | ----- Invoke

Это работает, когда действие НЕ СОДЕРЖИТ получение / отправка сообщений. Но когда я пытаюсь выполнить действие, содержащее сообщения о приеме / отправке, результатом является исключение

WorkflowApplicationUnhandledExceptionEventArgs: для создания закладок с областью можно использовать только зарегистрированные области закладок.

код:

1-Load xaml: (Загрузка активности)

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- Выполнить операцию:

  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 Input.
        /// </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;
            }

        }
    }

Есть идеи?

1 Ответ

0 голосов
/ 07 октября 2011

Вы можете использовать действие «Получить» только в рабочем процессе, размещенном в WorkflowServiceHost. Даже если ваш основной рабочий процесс размещен в WorkflowServiceHost, дочерний рабочий процесс размещается в WorkflowApplication и не может содержать действие Receive, поскольку оно не выполняется как часть инфраструктуры WCF.

...