Udostępnij za pośrednictwem


Właściwości wykonywania przepływu pracy

Za pomocą lokalnej pamięci wątku (TLS) CLR zarządza kontekstem 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, transakcja otoczenia i bieżący zestaw uprawnień, oraz właściwościami wątków zdefiniowanych przez użytkownika, takimi jak nazwane sloty.

W przeciwieństwie do programów bezpośrednio przeznaczonych dla środowiska CLR, programy przepływu pracy są hierarchiczne struktury drzewiaste działań, które wykonują się w środowisku niezależnym od wątków. 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 ścieżki 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ą interfejs IExecutionProperty, chociaż właściwości skoncentrowane na komunikatach zamiast tego mogą implementować interfejsy ISendMessageCallback i IReceiveMessageCallback. Aby utworzyć właściwość wykonania przepływu pracy, utwórz klasę, która implementuje interfejs IExecutionProperty i członków SetupWorkflowThread oraz 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 metodzie zastępowania wykonywania działania. W tym przykładzie zdefiniowano ConsoleColorScope aktywność, która rejestruje ConsoleColorProperty przez dodanie go do kolekcji Properties bieżącego 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);  
        }  
    }  
}  

Gdy ciało działania rozpoczyna impuls pracy, wywoływana jest metoda SetupWorkflowThread właściwości, a po zakończeniu impulsu pracy wywoływana jest metoda CleanupWorkflowThread. W tym przykładzie tworzony jest przepływ pracy, który używa Parallel aktywności z trzema gałęziami. Dwie pierwsze gałęzie używają ConsoleColorScope aktywności, a trzecia gałąź nie. Wszystkie trzy gałęzie zawierają dwie WriteLine czynności i jedną Delay aktywność. 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 jest wykonywane, prawidłowy kolor konsoli zostaje zastosowany przez element 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);  

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 / Notatka

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 zarządzania uchwytami dla działań, takich jak działania CorrelationScope i TransactionScope.

Zobacz także