Domanda

Microsoft ha almeno due differenti approches a supporto migliorato per operazioni simultanee.

1) Se la concorrenza Coordinamento Runtime (CCR), che fa parte di Microsoft Robotics Studio e CCR & DSS Toolkit

2) Task Parallel Library ( TPL ) (parte di .NET 4.0 e ora in Beta 1 rilascio)

Vorrei sapere se qualcuno ha esperienza con questi due diversi pezzi di software e sarebbe confrontare e contrapporre loro?

È stato utile?

Soluzione

In generale, entrambi i quadri hanno obiettivi complementari ma differenti.

Il CCR offre primitive per il coordinamento di processi concorrenti. Il coordinamento è il collante che fa un mucchio dei processi di lavoro nel suo insieme - in modo che il CCR offre primitive per lo scambio di messaggi tramite i cosiddetti canali. I processi possono attendere un messaggio di arrivare su un canale, o di un numero di canali, o di uno qualsiasi di un numero di canali e così via. Questo è un particolare paradigma per il coordinamento di processi concorrenti che funziona bene. Si noti inoltre che è non gratuito -. Devi comprare se da Microsoft separatamente

Il TPL offre primitive e le infrastrutture per parallellize calcoli o algoritmi semi-automatico. Uno dei primitivi più evidenti c'è il parallelo per ciclo -. Sembra un po 'come un ciclo for, ma cerca di eseguire il ciclo in parallelo

Quindi, se avete un po 'di processo che si desidera per coordinare su un livello più alto rispetto all'utilizzo di Stato e serrature condiviso, utilizzare il CCR. Se si dispone di un processo ad alta intensità di calcolo che si desidera eseguire in modo efficiente su una macchina multi-core, utilizzare il TPL.

Altri suggerimenti

Non è un o / o scenario. Il CCR è una libreria che supporta alcuni modelli di programmazione. È possibile mischiare CCR e il codice TPL come questo, ecco un Parallel.For all'interno di un delegato ricezione:

using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Ccr.Core;

namespace Demo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Dispatcher dispatcher = new Dispatcher();
            DispatcherQueue taskQueue = new DispatcherQueue("Demo", dispatcher);
            Port<int> portInt = new Port<int>();
            portInt.Post(Int32.Parse(args[0]));

            Arbiter.Activate(
                taskQueue,
                portInt.Receive(delegate(int count)
                {
                    Parallel.For(0, count, i =>
                    {
                        Console.Write(i.ToString() + " ");
                    });
                }
            ));
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top