Montag, 22. Februar 2010

Microsofts Concurrency Coordination Runtime (CCR) - Asynchron und doch zusammen

Wenn man mit asynchronen Tasks arbeitet, steht man oft vor dem Problem, das man diese zwar asynchron aufrufen möchte, aber dennoch im Haupttask auf das Ergebnis der losgelaufenen Prozesse warten möchte.

Einen Ansatz, wie dies mit WCF-Mitteln zu lösen ist, liefern uns in der Dotnetpro 3/2010 die Autoren Tobias Richling et al. in folgendem Artikel. Einen alternativen Ansatz unter Verwendung des Kommunikationsframework Xcoordination Application Space zeigt uns Ralf Westphal in seinem Beitrag One Man Think Tank Gedanken: Asynchronizität. Das Xcoordination Application Space (AppSpace)-Framwork ist eine Open Source Komponente, die bei CodePlex liegt und die Verteilung von Anwendungen erlaubt, die mit Microsofts Concurrency Coordination Runtime (CCR) arbeiten.

Ein einfaches Beispiel für einen Worker-Prozess (in mehreren Threads) sieht dann so aus:

   1: using System;
   2: using System.Threading;
   3: using Microsoft.Ccr.Core;
   4: using XcoAppSpaces.Core;
   5:  
   6: namespace MainDemo
   7: {
   8:     class Demo01SimpleWorker
   9:     {
  10:         public static void Main()
  11:         {
  12:             Console.WriteLine("Xco Application Space - Simple Worker Demo / Running on thread {0} / [Enter] to finish", Thread.CurrentThread.GetHashCode());
  13:  
  14:             using (XcoAppSpace space = new XcoAppSpace())
  15:             {
  16:                 // Start a worker locally. Using the call the worker is registered in the AppSpace instance
  17:                 // and listed as active. It´s now ready to received messages through its contract instance.
  18:                 // Workers are singletons.
  19:                 space.RunWorker<PWorker, MyWorker>();
  20:  
  21:                 PWorker w = space.Resolve<PWorker>();
  22:                 w.Post(1);
  23:                 w.Post("hello");
  24:                 w.Post(2);
  25:                 w.Post("world!");
  26:  
  27:                 // Without stopping here the process would terminate before the work
  28:                 // in the background has been finished.
  29:                 Console.ReadLine();
  30:             }
  31:  
  32:             Console.ForegroundColor = ConsoleColor.Green;
  33:             Console.WriteLine("Done! Some output has been generated.");
  34:         }
  35:  
  36:  
  37:         internal class PWorker : PortSet<int, string>{}
  38:  
  39:         // Workers need to implement a CCR Port or PortSet as its contract
  40:         internal class MyWorker : PWorker
  41:         {
  42:             // Mark methods to process contract messages with an Xco App Space attribute
  43:             // to have them automatically wired to a contract port.
  44:             [XcoConcurrent]
  45:             void ProcessInt(int msg)
  46:             {
  47:                 Console.WriteLine("  Received int {0} on thread {1}", msg, Thread.CurrentThread.GetHashCode());
  48:             }
  49:  
  50:             [XcoConcurrent]
  51:             void ProcessString(string msg)
  52:             {
  53:                 Console.WriteLine("  Received string '{0}' on thread {1}", msg, Thread.CurrentThread.GetHashCode());
  54:             }
  55:         }
  56:     }
  57: }

Keine Kommentare:

Kommentar veröffentlichen