Workflow Foundation e Real Parallel

Una delle cose che spiego sempre, quando parlo di Windows Workflow Foundation, è che la Parallel Activity non è una vera “parallel”. In definitiva, NON ESEGUE calcolo parallelo ma si limita ad eseguire “orizzontalmente” le activity contenute nei suoi branch. Francesco ne da dimostrazione in questo suo post.

La prima volta che discussi di questa cosa fu nel 2006 qui. Appaiono evidenti, dalla discussione, le varie problematiche legate alla gestione dei thread. L’ ultima volta in cui ne ho parlato è stato durante il corso che ho tenuto in ObjectWay.

Qualche giorno dopo (sembra quasi fatto apposta [:)] ), ecco apparire sul mio aggregatore un interessante post sull’ argomento: Multithreaded Parallelism in Windows Workflow Foundation.

Nell’ articolo si fa un uso interessante delle Activity call exthernal method ed handle external event che, in accoppiata con un “external service”, gestiscono l’esecuzione asincrona di un task:

The idea behind using CEMA and HEEA for managing parallel execution is simple. CEMA is intended for calling external methods (as the name implies), and HEEA is used for performing activities when an external event results (as the name implies). In our implementation of multithreaded parallel activities, we use CEMA and HEEA as a complementary pair around the work that needs to be done in parallel, and get that work shifted to a separate thread using an external service as intermediary; this thread is separate from the workflow thread that is allocated to the instance

Il servizio sterno è, in definitiva:

External services are .NET Framework classes that implement a well-defined, published interface. We will illustrate with the integer-adding service, which implements the well-defined IAddIntegerService interface. At design time, a programmer binds external services to CEMA/HEEA activities by placing their well-defined interfaces in the CEMA/HEEA activity properties. At run time, a service is registered with the WorkflowRuntime during initialization, so that the previously bound WF activities (in our example, CEMA/HEEA) have a service instance from which to consume the services

Il risultato che si ottiene, alla fine, è ben descritto in questa immagine:


(immagine tratta dall’articolo)

“Sulla carta”, ed a scopo didattico, l’articolo e gli spunti che se ne possono trarre, sono davvero interessanti. In effetti, la soluzione proposta è concettualmente corretta. Mi resta solo qualche dubbio sulla sua applicazione pratica.

In definitiva, il workaround proposto dall’aricolo può risultare interessante ed utile se ho necessità di sfruttare tutte le altre caratteristiche di Windows Workflow Foundation. Ma se ho la necessità di calcolo parallelo, devo necessariamente andare su codice nativo o sulle nuove Parallel Fx.

Leggi l’articolo completo: http://msdn2.microsoft.com/en-us/library/bb887609.aspx