Arquitetura de fluxo de trabalho do Windows
O Windows Workflow Foundation (WF) aumenta o nível de abstração para desenvolver aplicativos interativos de longa duração. As unidades de trabalho são encapsuladas como atividades. As atividades executam em um ambiente que fornece recursos para o controle de fluxo, manipulação de exceção, a propagação de falha, persistência de dados do estado, ao carregamento e descarregamento de fluxos de trabalho em andamento de memória, de rastreamento, e de fluxo de transação.
Arquitetura de atividades
As atividades são desenvolvidas como os tipos de CLR que derivam de Activity, de CodeActivity, de AsyncCodeActivity, ou de NativeActivity, ou as suas variantes que retornam um valor, Activity<TResult>, CodeActivity<TResult>, AsyncCodeActivity<TResult>, ou NativeActivity<TResult>. Desenvolver as atividades que derivam de Activity permite que o usuário reúne atividades pré-compilação existentes para criar rapidamente as unidades de trabalho que executam no ambiente de fluxo de trabalho. CodeActivity, por outro lado, permite a lógica de execução a ser criado em código gerenciado usando CodeActivityContext principalmente para acesso aos argumentos de atividade. AsyncCodeActivity é semelhante a CodeActivity exceto que pode ser usado para implementar tarefas assíncronas. Desenvolver as atividades que derivam de NativeActivity permite que os usuários acessem o runtime com NativeActivityContext para a funcionalidade como filhos de programação, criando indexadores, invocando o trabalho assíncrona, registrando transações, e mais.
As atividades de design que derivam de Activity são declarativas e essas atividades podem ser criadas em XAML. No exemplo a seguir, uma atividade chamada Prompt
é criada usando outras atividades para o corpo de execução.
<Activity x:Class='Prompt'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns:z='http://schemas.microsoft.com/netfx/2008/xaml/schema'
xmlns:my='clr-namespace:XAMLActivityDefinition;assembly=XAMLActivityDefinition'
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns="http://schemas.microsoft.com/2009/workflow">
<z:SchemaType.Members>
<z:SchemaType.SchemaProperty Name='Text' Type='InArgument(s:String)' />
<z:SchemaType.SchemaProperty Name='Response' Type='OutArgument(s:String)' />
</z:SchemaType.Members>
<Sequence>
<my:WriteLine Text='[Text]' />
<my:ReadLine BookmarkName='r1' Result='[Response]' />
</Sequence>
</Activity>
Contexto de atividades
ActivityContext é a interface de autor de atividade do runtime de fluxo de trabalho e fornece acesso a riqueza de runtime dos recursos. No exemplo a seguir, uma atividade é definida que usa o contexto de execução para criar um marcador (o mecanismo que permite uma atividade registra um ponto de continuação de linha em sua execução que pode ser continuada por um host que passa dados na atividade).
public sealed class ReadLine : NativeActivity<string>
{
[RequiredArgument]
public InArgument<string> BookmarkName { get; set; }
protected override void Execute(NativeActivityContext context)
{
// Create a Bookmark and wait for it to be resumed.
context.CreateBookmark(BookmarkName.Get(context),
new BookmarkCallback(OnResumeBookmark));
}
// NativeActivity derived activities that do asynchronous operations by calling
// one of the CreateBookmark overloads defined on System.Activities.NativeActivityContext
// must override the CanInduceIdle property and return true.
protected override bool CanInduceIdle
{
get { return true; }
}
public void OnResumeBookmark(NativeActivityContext context, Bookmark bookmark, object obj)
{
// When the Bookmark is resumed, assign its value to
// the Result argument.
Result.Set(context, (string)obj);
}
Ciclo de vida de atividades
Uma instância de uma atividade começa em estado de Executing . A menos que as exceções são localizadas, permanece nesse estado até que todas as atividades filho sejam executar completo e qualquer outro trabalho pendente (Bookmark objetos, por exemplo) está concluído, ao ponto que ele faz a transição de estado de Closed . O pai de uma instância da atividade pode solicitar um filho; cancelar se o filho pode ser cancelado termina em estado de Canceled . Se uma exceção é lançada durante a execução, o runtime coloca a atividade no estado de Faulted e propaga a exceção acima da cadeia pai de atividades. A seguir estão os três estados de conclusão de uma atividade:
Fechado: a atividade concluiu seu trabalho e foi encerrada.
Cancelado: a atividade abandonou normalmente seu trabalho e foi encerrada. O trabalho não será revertido explicitamente quando esse estado está conectado.
Falha: a atividade encontrou um erro e foi encerrada sem concluir seu trabalho.
As atividades permanecem no estado de Executing quando são persistentes ou descarregadas.