Einstieg zur Workflow Foundation 4 : Workflows asynchron aufrufen

by Gregor Biswanger 15. Dezember 2010 07:00

Für das Ausführen von Workflows dient der leichtgewichtige WorkflowInvoker als Workflow Hoster. Dieser kann auch Workflows asynchron in einem getrennten Thread aufrufen.

Beispiel: WorkflowAsyncExample

In Visual Studio 2010 wird ein neues “Workflow Console Application”-Projekt mit dem Namen “WorkflowAsyncExample” angelegt.

SNAGHTML3b36e9d

Abb.1 – Neues “Workflow Console Application” Projekt erzeugen.

 

Workflow definieren

Nach dem anlegen des Projekts wird automatisch der Workflow1 im Designer dargestellt. Nun soll der Name noch in DemoWorkflow unbenannt werden. Dazu wird links oben im Designer auf den Namen Workflow1 geklickt. Das Property-Fenster sollte nun mit dem aktuellen Namen öffnen. Leider muss zusätzlich auch manuell der Dateinamen im Solution-Explorer auf DemoWorkflow.xaml unbenannt werden.

Folgende Schritte sollen nun dem Workflow definiert werden:

  1. Dem Workflow eine Sequence activity aus der Toolbox setzen.
  2. WriteLine activity zur Sequence hinzufügen und folgende Expression setzen:
    String.Format(“Workflow gestartet: Thread:{0}”, System.Threading.Thread.CurrentThread.ManagedThreadId)
  3. Weitere WriteLine activity mit folgender Expression setzen:
    String.Format(“Workflow wartet...“)
  4. Delay activity mit folgender Expression setzen:
    TimeSpan.FromSeconds(5)
  5. WriteLine activtiy mit folgender Expression setzen:
    String.Format("Workflow fertig! - Thread:{0}", System.Threading.Thread.CurrentThread.ManagedThreadId)

 

Ist alles korrekt umgesetzt worden sollte es im Designer aussehen wie unter Abb.2 veranschaulicht wird.

image

Abb.2 – DemoWorkflow definiert.

 

Workflow mit Workflow Hoster aufrufen

In der Program.cs-Datei im Solution Explorer befindet sich der WorkflowInvoker der als Workflow Hoster fungiert. Nach dem umbenennen des Workflows in DemoWorkflow, kann der im Vorfeld definierte Workflow mit dem Namen Workflow1 nicht mehr gefunden werden. Das spielt keine Rolle, denn der Source Code wird wie unter Listing 1 abgeändert.

 

   1:  class Program
   2:  {
   3:      private static readonly AutoResetEvent WaitEvent = new AutoResetEvent(false);
   4:   
   5:      static void Main(string[] args)
   6:      {
   7:          Console.WriteLine("Host: Ich starte DemoWorkflow - Thread: {0}", Thread.CurrentThread.ManagedThreadId);
   8:   
   9:          try
  10:          {
  11:              WorkflowInvoker workflowInvoker = new WorkflowInvoker(new DemoWorkflow());
  12:              workflowInvoker.InvokeCompleted += (s, e) =>
  13:                                                     {
  14:                                                         Console.WriteLine("Host: Workflow ist fertig - Thread: {0}", Thread.CurrentThread.ManagedThreadId);
  15:                                                         WaitEvent.Set();
  16:                                                     };
  17:   
  18:              workflowInvoker.InvokeAsync();
  19:                  
  20:              Console.WriteLine("Host: DemoWorkflow gestartet... - Thread: {0}", Thread.CurrentThread.ManagedThreadId);
  21:              WaitEvent.WaitOne();
  22:          }
  23:          catch (Exception exception)
  24:          {
  25:              Console.WriteLine("Host: Workflow exception: {0}", exception.Message);
  26:          }
  27:   
  28:          Console.ReadLine();
  29:      }
  30:  }

Listing 1 – Workflow asynchron aufrufen.

Beginnend mit Zeile 3 wird eine Instanz von AutoResetEvent erzeugt um auf den Asynchronen Thread warten zu können. Ab Zeile 11 wird diesmal vom WorkflowInvoker ebenfalls eine Instanz erzeugt, womit dann das Event InvokeCompleted (Zeile 12) abonniert werden kann. Auf das Event wird mittels Lambda Delegate reagiert (siehe anonyme Methoden, Tanz den => Lambda mit mir...). Mittels InvokeAsync (Zeile 18) wird dann der Workflow gestartet.

Beim starten der Anwendung mittels [F5] Tastendruck sollte sich die Console öffnen und wie unter Abb.3 dargestellt werden.

SNAGHTML3f7930f

Abb.3 – Ausgabe der asynchronen Verarbeitung von DemoWorkflow.

Bei der Ausgabe wird ersichtlich das der spätere Programmfluss unter einem anderen Thread weitergeführt wird. Eine weitere Möglichkeit zum asynchronen Aufruf wäre über die BeginInvoke-Methode (http://msdn.microsoft.com/de-de/library/dd465912.aspx).



Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
kick it on dotnet-kicks.de

Kommentare

Powered by BlogEngine.NET 1.4.5.0
Theme by Extensive SEO

Über den Autor

Gregor Biswanger

Microsoft MVP für Client App Dev
XING

Gregor Biswanger (Microsoft MVP für Client App Dev) ist freier Consultant, Trainer, Autor und Speaker.


Seine Schwerpunkte liegen im Bereich der .NET-Architektur, agilen Prozessen und XAML. Er veröffentlichte vor kurzem seine DVD´s mit Video-Trainings zum Thema „Meine erste Windows 8 App“, „Windows Store Apps mit XAML und C#“ und „WPF 4.5 und Silverlight 5“ bei Addison-Wesley von video2brain.


Biswanger ist auch im Auftrag von Intel GmbH als Technologieberater für die Intel Developer Zone aktiv und ist Leader bei der Ingolstädter .NET Developers Group (INdotNET). 

 

Video über mich:
http://www.youtube.com/watch?v=mx_6SiiLxjk


Basta! 2011 Speaker

CLIPer

MCTS
Windows SharePoint Services 3.0 – Application Development (MCTS)