Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 threadeigenschappen die door de gebruiker zijn gedefinieerd, zoals benoemde slots.
In tegenstelling tot programma's die rechtstreeks gericht zijn op de CLR, zijn werkstroomprogramma's hiƫrarchisch georganiseerde bomen 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 subtree vallen en voorzien ook in opties voor het instellen en afbreken van TLS voor een correcte samenwerking met CLR-objecten.
Eigenschappen voor werkstroomuitvoering maken en gebruiken
Eigenschappen van werkstroomuitvoering implementeren meestal de IExecutionProperty interface, hoewel de eigenschappen die zich richten op berichtenverkeer, kunnen in plaats daarvan de ISendMessageCallback en IReceiveMessageCallback implementeren. Om een werkstroomuitvoeringseigenschap te maken, maakt u een klasse die de IExecutionProperty interface implementeert en implementeer de leden SetupWorkflowThread en CleanupWorkflowThread. Deze leden bieden de uitvoeringseigenschap de mogelijkheid om de lokale threadopslag correct in te stellen en op te ruimen tijdens elke puls van het werk van de activiteit die de eigenschap bevat, inclusief eventuele subactiviteiten. In dit voorbeeld wordt er een ConsoleColorProperty gemaakt die de Console.ForegroundColor instelt.
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 werkpuls 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 in de vertakkingen zijn opgenomen in afwisselende volgorde uitgevoerd. Terwijl elke onderliggende activiteit wordt uitgevoerd, wordt de juiste consolekleur 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.
Opmerking
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.