官术网_书友最值得收藏!

Running a WF program asynchronously

In the previous tasks, we used the WorkflowInvoker.Invoke method to start a workflow instance on the same thread as the main program. It is easy to use; however, in most real applications, a workflow should run on an independent thread. In this task, we will use WorkflowApplication to run a workflow instance.

How to do it...

  1. Create a workflow project:

    Create a new Workflow Console Application under the Chapter01 solution and name the project as UseWorkflowApplication.

  2. Author a workflow:

    In the opening Workflow1.xaml designer, click on Arguments, create two Int32 InArguments for Number1 and Number2. Create an Int32 OutArgument for Result. Add an Assign activity to the workflow designer panel. In the Assign activity, type Result=Number1+Number2.

    How to do it...
  3. Write code to host the workflow:

    Open Program.cs file and change code as follow:

    using System;
    using System.Activities;
    using System.Activities.Statements;
    using System.Threading;
    using System.Collections.Generic;
    
    namespace UseWorkflowApplication{
        class Program{
            static void Main(string[] args){
                AutoResetEvent syncEvent = 
                   new AutoResetEvent(false);
                IDictionary<string, object> input = 
                   new Dictionary<string, object>()
                {
                    {"Number1",123},
                    {"Number2",456}
                };
                IDictionary<string,object> output=null;
                WorkflowApplication wfApp = 
                   new WorkflowApplication(new Workflow1(),input);
                wfApp.Completed = 
                delegate(WorkflowApplicationCompletedEventArgs e)
                {
                    Console.WriteLine("Workflow thread id:"+
                            Thread.CurrentThread.ManagedThreadId);
                    output = e.Outputs;
                    syncEvent.Set();
                };
                wfApp.Run();
                syncEvent.WaitOne();
                Console.WriteLine(output["Result"].ToString());
                Console.WriteLine("Host thread  id:"+Thread.CurrentThread.ManagedThreadId);
            }
        }
    }
  4. Run it:

    Set UseWorkflowApplication as Startup project. Press Ctrl+F5 to build and run the workflow without debugging. The application should run in a console window and print the following message:

    How to do it...

How it works...

The function of this workflow is adding two InArgument Numbers and assigning the result to an OutArgument Result.

AutoResetEvent syncEvent = new AutoResetEvent(false);

As the workflow thread runs simultaneously with the caller thread, the caller thread may terminate before the workflow thread. To prevent this unexpected program quit, we need to use AutoResetEvent to synchronize caller and workflow thread.

syncEvent.WaitOne();

The caller thread will wait there, until syncEvent is set.

wfApp.Completed = 
delegate(WorkflowApplicationCompletedEventArgs e)
{
   output = e.Outputs;
   syncEvent.Set();
};

When the workflow completes, syncEvent.Set() is invoked. After that, the caller can continue running to its end.

Another thing we should be aware of is how we get the result when the workflow ends. Unlike the WorkflowInvoker.Invoker method, in a WorkflowApplication-style caller, we get dictionary output from WorkflowApplicationCompletedEventArgs's Outputs property; see the preceding code snippet.

主站蜘蛛池模板: 康平县| 黄平县| 民丰县| 静宁县| 霞浦县| 天柱县| 宣威市| 道孚县| 历史| 凌海市| 唐海县| 新竹县| 新晃| 嘉黎县| 宜良县| 双峰县| 南投市| 阜宁县| 淮安市| 阿克苏市| 惠州市| 青海省| 大方县| 新平| 宕昌县| 沈阳市| 惠安县| 普安县| 上林县| 宜良县| 广水市| 河津市| 慈利县| 西吉县| 甘南县| 西贡区| 衡阳市| 剑河县| 合阳县| 郁南县| 监利县|