Vlastnosti spuštění pracovního postupu
Prostřednictvím místního úložiště vlákna (TLS) clR udržuje kontext spuštění pro každé vlákno. Tento kontext spuštění řídí dobře známé vlastnosti vlákna, jako je identita vlákna, okolí transakce a aktuální oprávnění sada kromě uživatelsky definovaných vlastností vlákna, jako jsou pojmenované sloty.
Na rozdíl od programů, které přímo cílí na CLR, jsou programy pracovního postupu hierarchicky vymezeny stromy aktivit, které se provádějí v prostředí nezávislém na vláknech. To znamená, že standardní mechanismy TLS nelze přímo použít k určení kontextu v oboru pro danou pracovní položku. Například dvě paralelní větve provádění mohou používat různé transakce, ale plánovač může prokládání jejich provádění ve stejném vlákně CLR.
Vlastnosti provádění pracovního postupu poskytují mechanismus pro přidání kontextových specifických vlastností do prostředí aktivity. To umožňuje aktivitě deklarovat, které vlastnosti jsou v rozsahu pro svůj dílčí strom, a také poskytuje háky pro nastavení a zrušení protokolu TLS pro správnou spolupráci s objekty CLR.
Vytváření a používání vlastností provádění pracovního postupu
Vlastnosti provádění pracovního postupu obvykle implementují IExecutionProperty rozhraní, i když vlastnosti zaměřené na zasílání zpráv mohou implementovat ISendMessageCallback a IReceiveMessageCallback místo toho. Chcete-li vytvořit vlastnost provádění pracovního postupu, vytvořte třídu, která implementuje IExecutionProperty rozhraní a implementuje členy SetupWorkflowThread a CleanupWorkflowThread. Tito členové poskytují vlastnost provádění s příležitostí správně nastavit a snížit místní úložiště vlákna během každého impulsu práce aktivity, která obsahuje vlastnost, včetně všech podřízených aktivit. V tomto příkladu se vytvoří, ConsoleColorProperty
který nastaví 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;
}
}
Autoři aktivit mohou tuto vlastnost použít tak, že ji zaregistrují v přepsání spuštění aktivity. V tomto příkladu je definována ConsoleColorScope
aktivita, která registruje ConsoleColorProperty
přidáním do Properties kolekce aktuálního 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);
}
}
}
Když tělo aktivity spustí impuls práce, SetupWorkflowThread metoda vlastnosti je volána, a když je impuls práce dokončen, CleanupWorkflowThread je volána. V tomto příkladu se vytvoří pracovní postup, který používá Parallel aktivitu se třemi větvemi. První dvě větve používají ConsoleColorScope
aktivitu a třetí větev ne. Všechny tři větve obsahují dvě WriteLine aktivity a Delay aktivitu. Parallel Při spuštění aktivity se aktivity obsažené ve větvích spouští prokláněným způsobem, ale při každém spuštění podřízené aktivity se použije ConsoleColorProperty
správná barva konzoly .
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);
Při vyvolání pracovního postupu se do okna konzoly zapíše následující výstup.
Start blue text.
Start red text.
Start default text.
End blue text.
End red text.
End default text.
Poznámka:
I když se v předchozím výstupu nezobrazuje, zobrazí se každý řádek textu v okně konzoly v označené barvě.
Vlastnosti provádění pracovního postupu můžou používat vlastní autoři aktivit a poskytují také mechanismus správy pro aktivity, jako CorrelationScope jsou aktivity a TransactionScope aktivity.