DynamicActivityCreation

Le informazioni contenute in questo argomento sono valide per Windows Workflow Foundation 4.

In questo esempio vengono illustrati due modi diversi per creare un'attività in fase di esecuzione utilizzando l'attività DynamicActivity.

In questo esempio, un'attività viene creata in fase di esecuzione con un corpo contenente un'attività Sequence che contiene le attività ForEach e Assign. Un elenco di input di Integer viene passato all'attività e impostato come proprietà. L'attività ForEach scorre quindi l'elenco di valori e lo accumula. Nell'attività Assign, il valore medio è calcolato dividendo l'accumulatore per il numero di elementi nell'elenco e assegnandolo alla media.

Nell'esempio viene illustrato l'utilizzo di un'attività DynamicActivity che consente l'ingresso di variabili come argomenti di input e restituisce valori come argomenti di output. L'attività dispone di un argomento di input denominato Numbers, ovvero un elenco di Integer. L'attività ForEach scorre l'elenco di valori e lo accumula. Nell'attività Assign, il valore medio è calcolato dividendo l'accumulatore per il numero di elementi nell'elenco e assegnandolo alla media. La media viene restituita come argomento di output denominato Average.

Quando l'attività dinamica viene creata a livello di codice, l'input e l'output vengono dichiarati come mostrato nell'esempio di codice seguente.

DynamicActivity act = new DynamicActivity()
{
    DisplayName = "Find average",
    Properties = 
    {
        // Input argument
        new DynamicActivityProperty
        {
            Name = "Numbers",
            Type = typeof(InArgument<List<int>>),
            Value = numbers
        },
        // Output argument
        new DynamicActivityProperty
        {
            Name = "Average",
            Type = typeof(OutArgument<double>),
            Value = average
        }
    },
};

Nell'esempio di codice seguente viene illustrata la definizione completa dell'oggetto DynamicActivity che calcola la media dei valori in un elenco.

DynamicActivity act = new DynamicActivity()
{
    DisplayName = "Find average",
    Properties = 
    {
        // Input argument
        new DynamicActivityProperty
        {
            Name = "Numbers",
            Type = typeof(InArgument<List<int>>),
            Value = numbers
        },
        // Output argument
        new DynamicActivityProperty
        {
            Name = "Average",
            Type = typeof(OutArgument<double>),
            Value = average
        }
    },
    Implementation = () =>
        new Sequence
        {
            Variables = { result, accumulator },
            Activities =
            {
                new ForEach<int>
                {
                    Values =  new ArgumentValue<IEnumerable<int>> { ArgumentName = "Numbers" },                                
                    Body = new ActivityAction<int>
                    {
                        Argument = iterationVariable,
                        Handler = new Assign<int>
                        {
                            To = accumulator,
                            Value = new InArgument<int>(env => iterationVariable.Get(env) +  accumulator.Get(env))
                        }
                    }
                },

                // Calculate the average and assign to the output argument.
                new Assign<double>
                {
                    To = new ArgumentReference<double> { ArgumentName = "Average" },
                    Value = new InArgument<double>(env => accumulator.Get(env) / numbers.Get(env).Count<int>())
                },
            }
        }
};

Se creati in XAML, l'input e l'output vengono dichiarati come mostrato nell'esempio seguente.

<Activity x:Class="Microsoft.Samples.DynamicActivityCreation.FindAverage"
          xmlns="https://schemas.microsoft.com/netfx/2009/xaml/activities"
          xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib"
          xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">
  <x:Members>
    <x:Property Name="Numbers" Type="InArgument(scg:List(x:Int32))" />
    <x:Property Name="Average" Type="OutArgument(x:Double)" />
  </x:Members>
    ...
    ...
</Activity>

Il codice XAML può essere creato in modo visivo tramite Progettazione flussi di lavoro di Windows. Se è incluso in un progetto di Visual Studio, assicurarsi di impostare la relativa opzione "Compila Azione" su "Nessuna" per evitare che venga compilato. Il codice XAML può quindi essere caricato dinamicamente utilizzando la chiamata seguente.

Activity act2 = ActivityXamlServices.Load(@"FindAverage.xaml");

L'istanza DynamicActivity creata a livello di codice o tramite il caricamento di un flusso di lavoro XAML può essere utilizzata come mostrato nell'esempio di codice seguente. Si noti che l'"atto" passato all'oggetto WorkflowInvoker.Invoke è l'"atto" Activity definito nel primo esempio di codice.

IDictionary<string, object> results = WorkflowInvoker.Invoke(act, new Dictionary<string, object> { { "Numbers", numbers } });

Console.WriteLine("The average calculated using the code activity is = " + results["Average"]);

Per utilizzare questo esempio

  1. In Visual Studio 2010 aprire il file della soluzione DynamicActivityCreation.sln.

  2. Per compilare la soluzione, premere F6.

  3. Per eseguire la soluzione, premere CTRL+F5.

Argomenti della riga di comando

In questo esempio sono accettati gli argomenti della riga di comando. Gli utenti possono fornire un elenco di numeri affinché l'attività calcoli la media. L'elenco di numeri da utilizzare viene passato come elenco di numeri separati da uno spazio. Ad esempio per calcolare la media di 5, 10 e 32, richiamare l'esempio utilizzando la riga di comando seguente.

DynamicActivityCreation 5 10 32
Dd807392.Important(it-it,VS.100).gif Nota:
È possibile che gli esempi siano già installati nel computer. Verificare la directory seguente (impostazione predefinita) prima di continuare.

<UnitàInstallazione>:\WF_WCF_Samples

Se questa directory non esiste, andare alla sezione relativa agli esempi di Windows Communication Foundation (WCF) e Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti gli esempi Windows Communication Foundation (WCF) e WF. Questo esempio si trova nella directory seguente.

<UnitàInstallazione>:\WF_WCF_Samples\WF\Basic\Built-InActivities\DynamicActivity\DynamicActivityCreation