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...
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);
}
How it works...
The function of this Workflow is adding two InArgument Numbers and assigning the result to an OutArgument Result.
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.
The caller thread will wait there, until syncEvent is 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 getdictionary output from WorkflowApplicationCompletedEventArgs's Outputs property; see the preceding code snippet.