- Microsoft Windows Workflow Foundation 4.0 Cookbook
- Andrew Zhu
- 366字
- 2021-04-13 17:00:36
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.
- Create a workflow project:
Create a new Workflow Console Application under the
Chapter01
solution and name the project asUseWorkflowApplication
. - Author a workflow:
In the opening
Workflow1.xaml
designer, click on Arguments, create twoInt32
InArguments
for Number1 and Number2. Create anInt32 OutArgument
for Result. Add an Assign activity to the workflow designer panel. In the Assign activity, type Result=Number1+Number2. - 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); } } }
- Run it:
Set
UseWorkflowApplication
asStartup
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:
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.
- ModelSim電子系統(tǒng)分析及仿真(第3版)
- 創(chuàng)意UI:Photoshop玩轉(zhuǎn)移動(dòng)UI設(shè)計(jì)
- 像攝影師一樣調(diào)色
- SolidWorks2014基礎(chǔ)實(shí)例教程
- RESTful PHP Web Services
- Photoshop+CorelDRAW平面設(shè)計(jì)實(shí)例教程(第4版)
- ASP.NET 3.5 Application Architecture and Design
- After Effects CC 2018影視特效與合成案例教程
- Unity 3D\2D手機(jī)游戲開發(fā):從學(xué)習(xí)到產(chǎn)品(第4版)
- 正則表達(dá)式必知必會(huì)(修訂版)
- Photoshop CC 2019 平面設(shè)計(jì)實(shí)例教程
- 中文版CINEMA 4D R20 實(shí)用教程
- 中文版Photoshop CS6完全自學(xué)手冊(cè)(超值版)
- iOS智能手機(jī)APP界面設(shè)計(jì)實(shí)戰(zhàn)教程
- 玩轉(zhuǎn)微信5.0