Delen via


Eigenschappen van werkstroomuitvoering

Via lokale threadopslag (TLS) onderhoudt de CLR een uitvoeringscontext voor elke thread. Deze uitvoeringscontext bepaalt bekende threadeigenschappen, zoals de thread-identiteit, de omgevingstransactie en de huidige machtigingenset naast door de gebruiker gedefinieerde threadeigenschappen, zoals benoemde sites.

In tegenstelling tot programma's die rechtstreeks gericht zijn op de CLR, hebben werkstroomprogramma's hiërarchisch bereik van activiteiten die worden uitgevoerd in een thread-agnostische omgeving. Dit betekent dat de standaard TLS-mechanismen niet rechtstreeks kunnen worden gebruikt om te bepalen welke context binnen het bereik van een bepaald werkitem valt. Twee parallelle vertakkingen van de uitvoering kunnen bijvoorbeeld verschillende transacties gebruiken, maar de scheduler kan de uitvoering ervan in dezelfde CLR-thread onderbrengen.

Eigenschappen van werkstroomuitvoering bieden een mechanisme om contextspecifieke eigenschappen toe te voegen aan de omgeving van een activiteit. Hierdoor kan een activiteit declareren welke eigenschappen binnen het bereik van de substructuur vallen en biedt ook haken voor het instellen en afbreken van TLS om correct te kunnen samenwerken met CLR-objecten.

Eigenschappen voor werkstroomuitvoering maken en gebruiken

Eigenschappen van werkstroomuitvoering implementeren meestal de IExecutionProperty interface, hoewel eigenschappen die zijn gericht op berichten, in plaats daarvan kunnen worden geïmplementeerd ISendMessageCallback en IReceiveMessageCallback . Als u een eigenschap voor het uitvoeren van een werkstroom wilt maken, maakt u een klasse waarmee de IExecutionProperty interface wordt geïmplementeerd en de leden SetupWorkflowThread en CleanupWorkflowThread. Deze leden bieden de uitvoeringseigenschap een mogelijkheid om de lokale threadopslag correct in te stellen en te verwijderen tijdens elke pulse van het werk van de activiteit die de eigenschap bevat, inclusief eventuele onderliggende activiteiten. In dit voorbeeld wordt een ConsoleColorProperty gemaakt waarmee de 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;  
    }  
}  

Auteurs van activiteiten kunnen deze eigenschap gebruiken door deze te registreren bij de uitvoering van de activiteit. In dit voorbeeld wordt een ConsoleColorScope activiteit gedefinieerd waarmee de ConsoleColorProperty activiteit wordt geregistreerd door deze toe te voegen aan de Properties verzameling van de huidige NativeActivityContextactiviteit.

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);  
        }  
    }  
}  

Wanneer het lichaam van de activiteit een werkpuls start, wordt de SetupWorkflowThread methode van de eigenschap aangeroepen en wanneer de polsslag van het werk is voltooid, wordt de CleanupWorkflowThread aangeroepen. In dit voorbeeld wordt een werkstroom gemaakt die gebruikmaakt van een Parallel activiteit met drie vertakkingen. De eerste twee vertakkingen gebruiken de ConsoleColorScope activiteit en de derde vertakking niet. Alle drie de vertakkingen bevatten twee WriteLine activiteiten en een Delay activiteit. Wanneer de Parallel activiteit wordt uitgevoerd, worden de activiteiten die zijn opgenomen in de vertakkingen op een interleaved manier uitgevoerd, maar wanneer elke onderliggende activiteit de juiste consolekleur uitvoert, wordt toegepast door de 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);  

Wanneer de werkstroom wordt aangeroepen, wordt de volgende uitvoer naar het consolevenster geschreven.

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

Notitie

Hoewel deze niet wordt weergegeven in de vorige uitvoer, wordt elke tekstregel in het consolevenster weergegeven in de aangegeven kleur.

Eigenschappen van werkstroomuitvoering kunnen worden gebruikt door auteurs van aangepaste activiteiten en ze bieden ook het mechanisme voor het afhandelen van beheer voor activiteiten zoals de CorrelationScope en TransactionScope activiteiten.

Zie ook