Condividi tramite


Proprietà di esecuzione del flusso di lavoro

Tramite l'archiviazione locale del thread (TLS), CLR mantiene un contesto di esecuzione per ogni thread. Questo contesto di esecuzione regola le proprietà di thread note, ad esempio l'identità del thread, la transazione di ambiente e il set di autorizzazioni corrente, oltre alle proprietà del thread definite dall'utente, come gli slot denominati.

A differenza dei programmi destinati direttamente a CLR, i programmi del flusso di lavoro sono alberi con ambito gerarchico di attività eseguite in un ambiente indipendente dai thread. Ciò implica che i meccanismi TLS standard non possono essere usati direttamente per determinare il contesto nell'ambito di un determinato elemento di lavoro. Ad esempio, due rami paralleli di esecuzione potrebbero usare diverse transazioni, ma il pianificatore potrebbe intercalare la loro esecuzione nello stesso thread CLR.

Le proprietà di esecuzione del flusso di lavoro forniscono un meccanismo per aggiungere proprietà specifiche del contesto all'ambiente di un'attività. Ciò consente a un'attività di dichiarare quali proprietà sono nell'ambito di applicazione per il relativo sottoalbero e fornisce anche hook per la configurazione e la rimozione di TLS per garantire una corretta interoperabilità con gli oggetti CLR.

Creazione e uso delle proprietà di esecuzione del flusso di lavoro

Le proprietà di esecuzione del flusso di lavoro in genere implementano l'interfaccia IExecutionProperty , anche se le proprietà incentrate sulla messaggistica possono implementare ISendMessageCallback e IReceiveMessageCallback . Per creare una proprietà di esecuzione del flusso di lavoro, creare una classe che implementa l'interfaccia IExecutionProperty e implementare i membri SetupWorkflowThread e CleanupWorkflowThread. Questi membri forniscono alla proprietà di esecuzione l'opportunità di configurare e rimuovere correttamente l'archiviazione locale del thread durante ogni impulso di lavoro dell'attività che contiene la proprietà, incluse eventuali attività figlio. In questo esempio viene creato un oggetto ConsoleColorProperty che imposta l'oggetto Console.ForegroundColor.

class ConsoleColorProperty : IExecutionProperty  
{  
    public const string Name = "ConsoleColorProperty";  
  
    ConsoleColor original;  
    ConsoleColor color;  
  
    public ConsoleColorProperty(ConsoleColor color)  
    {  
        this.color = color;  
    }  
  
    void IExecutionProperty.SetupWorkflowThread()  
    {  
        original = Console.ForegroundColor;  
        Console.ForegroundColor = color;  
    }  
  
    void IExecutionProperty.CleanupWorkflowThread()  
    {  
        Console.ForegroundColor = original;  
    }  
}  

Gli autori di attività possono usare questa proprietà registrandolo nell'override di esecuzione dell'attività. In questo esempio viene definita un'attività ConsoleColorScope che registra l'oggetto ConsoleColorProperty aggiungendolo alla Properties raccolta dell'oggetto corrente NativeActivityContext.

public sealed class ConsoleColorScope : NativeActivity  
{  
    public ConsoleColorScope()  
        : base()  
    {  
    }  
  
    public ConsoleColor Color { get; set; }  
    public Activity Body { get; set; }  
  
    protected override void Execute(NativeActivityContext context)  
    {  
        context.Properties.Add(ConsoleColorProperty.Name, new ConsoleColorProperty(this.Color));  
  
        if (this.Body != null)  
        {  
            context.ScheduleActivity(this.Body);  
        }  
    }  
}  

Quando il corpo dell'attività avvia un impulso di lavoro, viene chiamato il metodo della proprietà SetupWorkflowThread, e quando l'impulso di lavoro è completo, viene chiamato il metodo CleanupWorkflowThread. In questo esempio viene creato un flusso di lavoro che usa un'attività Parallel con tre rami. I primi due rami usano l'attività ConsoleColorScope e il terzo ramo non lo fa. Tutti e tre i rami contengono due WriteLine attività e un'attività Delay . Quando l'attività Parallel viene eseguita, le attività contenute nei rami vengono eseguite in modo alternato, e per ogni attività figlia che si esegue, il colore corretto della console viene applicato da ConsoleColorProperty.

Activity wf = new Parallel  
{  
    Branches =
    {  
        new ConsoleColorScope  
        {  
            Color = ConsoleColor.Blue,  
            Body = new Sequence  
            {  
                Activities =
                {  
                    new WriteLine  
                    {  
                        Text = "Start blue text."  
                    },  
                    new Delay  
                    {  
                        Duration = TimeSpan.FromSeconds(1)  
                    },  
                    new WriteLine  
                    {  
                        Text = "End blue text."  
                    }  
                }  
            }  
        },  
        new ConsoleColorScope  
        {  
            Color = ConsoleColor.Red,  
            Body = new Sequence  
            {  
                Activities =
                {  
                    new WriteLine  
                    {  
                        Text = "Start red text."  
                    },  
                    new Delay  
                    {  
                        Duration = TimeSpan.FromSeconds(1)  
                    },  
                    new WriteLine  
                    {  
                        Text = "End red text."  
                    }  
                }  
            }  
        },  
        new Sequence  
        {  
            Activities =
            {  
                new WriteLine  
                {  
                    Text = "Start default text."  
                },  
                new Delay  
                {  
                    Duration = TimeSpan.FromSeconds(1)  
                },  
                new WriteLine  
                {  
                    Text = "End default text."  
                }  
            }  
        }  
    }  
};  
  
WorkflowInvoker.Invoke(wf);  

Quando viene richiamato il flusso di lavoro, l'output seguente viene scritto nella finestra della console.

Start blue text.  
Start red text.  
Start default text.  
End blue text.  
End red text.  
End default text.  

Annotazioni

Anche se non viene visualizzato nell'output precedente, ogni riga di testo nella finestra della console viene visualizzata nel colore indicato.

Le proprietà di esecuzione del flusso di lavoro possono essere utilizzate dagli autori di attività personalizzate e forniscono anche il meccanismo per la gestione degli handle per attività come le attività CorrelationScope e TransactionScope.

Vedere anche