DynamicActivityCreationDynamicActivity Creation

In questo esempio vengono illustrati due modi diversi per creare un'attività in fase di esecuzione usando l'attività DynamicActivity.This sample demonstrates two different ways to create an activity at runtime using the DynamicActivity activity.

In questo esempio, un'attività viene creata in fase di esecuzione con un corpo contenente un'attività Sequence che contiene le attività ForEach<T> e Assign<T>.In this sample, an activity is created at runtime with a body that contains a Sequence activity that contains ForEach<T> and Assign<T> activities. Un elenco di input di Integer viene passato all'attività e impostato come proprietà.An input list of integers is passed into the activity and set as a property. L'attività ForEach<T> scorre quindi l'elenco di valori e lo accumula.The ForEach<T> activity then iterates over the list of values and accumulates it. Nell'attività Assign<T>, il valore medio è calcolato dividendo l'accumulatore per il numero di elementi nell'elenco e assegnandolo alla media.In the Assign<T> activity, the average value is calculated by dividing the accumulator by the number of elements in the list and assign it to the average.

Nell'esempio viene illustrato l'uso di un'attività DynamicActivity che consente l'ingresso di variabili come argomenti di input e restituisce valori come argomenti di output.The sample demonstrates the usage of a DynamicActivity activity that flows in variables as input arguments and returning values as output arguments. L'attività dispone di un argomento di input denominato Numbers, ovvero un elenco di Integer.The activity has one input argument named Numbers that is a list of integers. L'attività ForEach<T> scorre l'elenco di valori e lo accumula.The ForEach<T> activity iterates over the list of values and accumulates it. Nell'attività Assign<T>, il valore medio è calcolato dividendo l'accumulatore per il numero di elementi nell'elenco e assegnandolo alla media.In the Assign<T> activity, the average value is calculated by dividing the accumulator by the number of elements in the list and assigning it to the average. La media viene restituita come argomento di output denominato Average.The average is returned as an output argument named 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.When the dynamic activity is created programmatically, the input and output are declared as shown in the following code example.

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.The following code example shows the complete definition of the DynamicActivity that computes the average of the values in a list.

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.When created in XAML, the input and output are declared as shown in the following example.

<Activity x:Class="Microsoft.Samples.DynamicActivityCreation.FindAverage"  
          xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities"  
          xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib"  
          xmlns:x="http://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.Windows Workflow Designer.The XAML can be created visually using the Progettazione flussi di lavoro di Windows.Windows Workflow Designer. Se è incluso in un progetto di Visual Studio, assicurarsi di impostare il "Compila azione" su "None" per evitare che si sta compilando.If it is included in a Visual Studio project, be sure to set its "Build Action" to "None" to prevent it from being compiled. Il codice XAML può quindi essere caricato dinamicamente usando la chiamata seguente.The XAML can then be loaded dynamically using the following call.

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 usata come mostrato nell'esempio di codice seguente.The DynamicActivity instance created programmatically or through loading a XAML workflow can be used as shown in the following code example. Si noti che "atto" passato al WorkflowInvoker.Invoke è il "atto" Activity definito nel primo esempio di codice.Please note that "act" passed to the WorkflowInvoker.Invoke is the "act" Activity defined in the first code example.

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 usare questo esempioTo use this sample

  1. In Visual Studio 2010Visual Studio 2010 aprire il file della soluzione DynamicActivityCreation.sln.Using Visual Studio 2010Visual Studio 2010, open the DynamicActivityCreation.sln solution file.

  2. Per compilare la soluzione, premere CTRL+MAIUSC+B.To build the solution, press CTRL+SHIFT+B.

  3. Per eseguire la soluzione, premere CTRL+F5.To run the solution, press CTRL+F5.

Argomenti della riga di comandoCommand line arguments

In questo esempio sono accettati gli argomenti della riga di comando.This sample accepts command line arguments. Gli utenti possono fornire un elenco di numeri affinché l'attività calcoli la media.Users can provide a list of numbers for the activity to calculate their average. L'elenco di numeri da usare viene passato come elenco di numeri separati da uno spazio.The list of numbers to be used is passed as a list of numbers separated by a space. Ad esempio per calcolare la media di 5, 10 e 32, richiamare l'esempio usando la riga di comando seguente.For example, to calculate the average of 5, 10, and 32 invoke the sample using the following command line.

DynamicActivityCreation 5 10 32DynamicActivityCreation 5 10 32

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your machine. Verificare la directory seguente (impostazione predefinita) prima di continuare.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se questa directory non esiste, andare al Windows Communication Foundation (WCF) e gli esempi di Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti i Windows Communication Foundation (WCF) e WFWF esempi.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Questo esempio si trova nella directory seguente.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WF\Basic\Built-InActivities\DynamicActivity\DynamicActivityCreation