Właściwości wykonania przepływu pracy
Za pośrednictwem magazynu lokalnego wątku (TLS) clR utrzymuje kontekst wykonywania dla każdego wątku. Ten kontekst wykonywania zarządza dobrze znanymi właściwościami wątku, takimi jak tożsamość wątku, otoczenia transakcji i bieżący zestaw uprawnień oprócz właściwości wątku zdefiniowanego przez użytkownika, takich jak nazwane gniazda.
W przeciwieństwie do programów bezpośrednio przeznaczonych dla środowiska CLR programy przepływu pracy są hierarchicznie zakresami drzew działań wykonywanych w środowisku niezgrabnym wątku. Oznacza to, że standardowe mechanizmy TLS nie mogą być bezpośrednio używane do określania kontekstu w zakresie danego elementu roboczego. Na przykład dwie równoległe gałęzie wykonywania mogą używać różnych transakcji, ale harmonogram może przeplatać ich wykonywanie w tym samym wątku CLR.
Właściwości wykonywania przepływu pracy zapewniają mechanizm dodawania właściwości specyficznych dla kontekstu do środowiska działania. Dzięki temu działanie może zadeklarować, które właściwości znajdują się w zakresie jego podzadrzewa, a także zapewnia haki do konfigurowania i usuwania protokołu TLS w celu prawidłowego współdziałania z obiektami CLR.
Tworzenie i używanie właściwości wykonywania przepływu pracy
Właściwości wykonywania przepływu pracy zwykle implementują IExecutionProperty interfejs, chociaż właściwości skoncentrowane na komunikatach mogą implementować ISendMessageCallback i IReceiveMessageCallback zamiast tego. Aby utworzyć właściwość wykonywania przepływu pracy, utwórz klasę, która implementuje interfejs i implementuje IExecutionProperty elementy członkowskie SetupWorkflowThread i CleanupWorkflowThread. Te elementy członkowskie zapewniają właściwość wykonywania z możliwością prawidłowego skonfigurowania i usuwania lokalnego magazynu wątku podczas każdego impulsu pracy działania zawierającego właściwość, w tym wszelkich działań podrzędnych. W tym przykładzie tworzony jest element ConsoleColorProperty
, który ustawia wartość 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;
}
}
Autorzy działań mogą używać tej właściwości, rejestrując ją w zastąpieniu wykonywania działania. W tym przykładzie zdefiniowano ConsoleColorScope
działanie, które rejestruje ConsoleColorProperty
obiekt przez dodanie go do Properties kolekcji bieżącego NativeActivityContextelementu .
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);
}
}
}
Gdy ciało działania rozpoczyna impuls pracy, SetupWorkflowThread wywoływana jest metoda właściwości, a po zakończeniu CleanupWorkflowThread impulsu pracy wywoływana jest metoda . W tym przykładzie tworzony jest przepływ pracy, który używa Parallel działania z trzema gałęziami. Pierwsze dwie gałęzie używają ConsoleColorScope
działania, a trzecia gałąź nie. Wszystkie trzy gałęzie zawierają dwa WriteLine działania i Delay działanie. Parallel Gdy działanie jest wykonywane, działania zawarte w gałęziach są wykonywane w sposób przeplatany, ale gdy każde działanie podrzędne wykonuje prawidłowy kolor konsoli jest stosowany przez ConsoleColorProperty
element .
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);
Po wywołaniu przepływu pracy następujące dane wyjściowe są zapisywane w oknie konsoli.
Start blue text.
Start red text.
Start default text.
End blue text.
End red text.
End default text.
Uwaga
Chociaż nie jest wyświetlany w poprzednich danych wyjściowych, każdy wiersz tekstu w oknie konsoli jest wyświetlany w wskazanym kolorze.
Właściwości wykonywania przepływu pracy mogą być używane przez autorów działań niestandardowych, a także zapewniają mechanizm obsługi zarządzania działaniami, takimi jak CorrelationScope działania i TransactionScope .