Freigeben über


Workflowausführungseigenschaften

Über den lokalen Threadspeicher (TLS) verwaltet die CLR einen Ausführungskontext für jeden Thread. Dieser Ausführungskontext steuert bekannte Threadeigenschaften wie die Threadidentität, die Umgebungstransaktion und den aktuellen Berechtigungssatz zusätzlich zu benutzerdefinierten Threadeigenschaften wie benannten Slots.

Im Gegensatz zu Programmen, die direkt auf die CLR abzielen, sind Workflowprogramme hierarchisch ausgerichtete Strukturen von Aktivitäten, die in einer threadagnostischen Umgebung ausgeführt werden. Dies bedeutet, dass die standardmäßigen TLS-Mechanismen nicht direkt verwendet werden können, um zu bestimmen, welcher Kontext für eine bestimmte Arbeitsaufgabe im Gültigkeitsbereich liegt. So können z. B. zwei parallele Ausführungszweige unterschiedliche Transaktionen verwenden, doch kann der Planer die Ausführung im selben CLR-Thread zwischenspeichern.

Workflowausführungseigenschaften bieten einen Mechanismus zum Hinzufügen kontextspezifischer Eigenschaften zur Umgebung einer Aktivität. Damit kann von einer Aktivität deklariert werden, welche Eigenschaften im Bereich ihrer Unterstruktur liegen, und es werden Hooks für das Einrichten und Beenden für den TLS bereitgestellt, damit eine ordnungsgemäße Zusammenarbeit mit CLR-Objekten ermöglicht werden kann.

Erstellen und Verwenden von Workflowausführungseigenschaften

Workflowausführungseigenschaften implementieren in der Regel die IExecutionProperty Schnittstelle, obwohl Eigenschaften, die sich auf Messaging konzentrieren, möglicherweise implementieren ISendMessageCallback und IReceiveMessageCallback stattdessen. Um eine Eigenschaft für die Ausführung des Workflows zu erstellen, erstellen Sie eine Klasse, die die IExecutionProperty-Schnittstelle implementiert und die Mitglieder SetupWorkflowThread und CleanupWorkflowThread realisiert. Mithilfe dieser Member kann von der Ausführungseigenschaft für jeden Arbeitsschritt der Aktivität mit dieser Eigenschaft (einschließlich etwaiger untergeordneter Aktivitäten) der lokale Threadspeicher ordnungsgemäß eingerichtet und beendet werden. In diesem Beispiel wird eine ConsoleColorProperty erstellt, mit der die Console.ForegroundColor festgelegt wird.

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

Aktivitätsautoren können diese Eigenschaft verwenden, indem sie in der Ausführungsüberschreibung der Aktivität registriert wird. In diesem Beispiel wird eine ConsoleColorScope-Aktivität definiert, die ConsoleColorProperty registriert, indem sie zur Properties-Sammlung der aktuellen NativeActivityContext hinzugefügt wird.

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

Wenn der Text der Aktivität einen Arbeitsschritt einleitet, wird die SetupWorkflowThread-Methode der Eigenschaft aufgerufen, und nach Abschluss des Schritts wird der CleanupWorkflowThread aufgerufen. In diesem Beispiel wird ein Workflow erstellt, der eine Parallel Aktivität mit drei Verzweigungen verwendet. Die ersten zwei Verzweigungen verwenden die ConsoleColorScope-Aktivität, die dritte Verzweigung jedoch nicht. Alle drei Filialen enthalten zwei WriteLine Aktivitäten und eine Delay Aktivität. Wenn die Parallel-Aktivität ausgeführt wird, werden die in den Verzweigungen enthaltenen Aktivitäten parallel ausgeführt. Bei der Ausführung der einzelnen untergeordneten Aktivitäten wird jedoch die richtige Konsolenfarbe von der ConsoleColorProperty angewendet.

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

Wenn der Workflow aufgerufen wird, wird die folgende Ausgabe in das Konsolenfenster geschrieben.

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

Hinweis

Obwohl sie nicht in der vorherigen Ausgabe angezeigt wird, wird jede Textzeile im Konsolenfenster in der angegebenen Farbe angezeigt.

Workflowausführungseigenschaften können von benutzerdefinierten Aktivitätsautoren verwendet werden. Sie bieten zudem den Mechanismus zur Verwaltung von Aktivitäten wie CorrelationScope und TransactionScope.

Siehe auch