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: }