Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os favoritos são o mecanismo que permite que uma atividade aguarde passivamente a entrada sem reter um encadeamento de fluxo de trabalho. Quando uma atividade sinaliza que está à espera de estímulo, pode criar um marcador. Isso indica ao tempo de execução que a execução da atividade não deve ser considerada completa, mesmo quando o método atualmente em execução (que criou o Bookmark) retorna.
Noções básicas de favoritos
A Bookmark representa um ponto no qual a execução pode ser retomada (e através do qual a entrada pode ser entregue) dentro de uma instância de fluxo de trabalho. Normalmente, a um Bookmark é dado um nome, e o código externo (host ou extensão) é responsável por retomar o marcador com dados relevantes. Quando um Bookmark é retomado, o tempo de execução do fluxo de trabalho agenda o BookmarkCallback delegado que estava associado a esse Bookmark no momento da sua criação.
Opções de favoritos
A BookmarkOptions classe especifica o tipo de Bookmark que está a ser criado. Os possíveis valores não mutuamente exclusivos são None, MultipleResumee NonBlocking. Use None, o padrão, ao criar um Bookmark que se espera que seja retomado exatamente uma vez. Use MultipleResume ao criar um Bookmark que pode ser retomado várias vezes. Use NonBlocking ao criar um Bookmark que pode nunca ser retomado. Ao contrário dos marcadores criados usando o padrão BookmarkOptions, NonBlocking os marcadores não impedem que uma atividade seja concluída.
Retomada do marcador
Os marcadores podem ser retomados através de código fora de um fluxo de trabalho usando uma das ResumeBookmark sobrecargas. Neste exemplo, uma ReadLine atividade é criada. Quando executada, a ReadLine atividade cria um Bookmark, regista um retorno de chamada e depois aguarda que o Bookmark seja retomado. Quando é retomada, a ReadLine atividade atribui os dados que foram passados com o Bookmark ao seu Result argumento.
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);
}
}
Neste exemplo, é criado um fluxo de trabalho que usa a ReadLine atividade para coletar o nome do usuário e exibi-lo na janela do console. O aplicativo host executa o trabalho real de coleta da entrada e a passa para o fluxo de trabalho retomando o Bookmark.
Variable<string> name = new Variable<string>
{
Name = "name"
};
Activity wf = new Sequence
{
Variables =
{
name
},
Activities =
{
new WriteLine()
{
Text = "What is your name?"
},
new ReadLine()
{
BookmarkName = "UserName",
Result = name
},
new WriteLine()
{
Text = new InArgument<string>((env) => "Hello, " + name.Get(env))
}
}
};
AutoResetEvent syncEvent = new AutoResetEvent(false);
// Create the WorkflowApplication using the desired
// workflow definition.
WorkflowApplication wfApp = new WorkflowApplication(wf);
// Handle the desired lifecycle events.
wfApp.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
{
// Signal the host that the workflow is complete.
syncEvent.Set();
};
// Start the workflow.
wfApp.Run();
// Collect the user's name and resume the bookmark.
// Bookmark resumption only occurs when the workflow
// is idle. If a call to ResumeBookmark is made and the workflow
// is not idle, ResumeBookmark blocks until the workflow becomes
// idle before resuming the bookmark.
wfApp.ResumeBookmark("UserName", Console.ReadLine());
// Wait for Completed to arrive and signal that
// the workflow is complete.
syncEvent.WaitOne();
Quando a ReadLine atividade é executada, ela cria um Bookmark chamado UserName e, em seguida, aguarda pela retoma do marcador. O host coleta os dados desejados e, em seguida, retoma o Bookmark. O fluxo de trabalho retoma, exibe o nome e depois conclui. Observe que nenhum código de sincronização é necessário em relação a retomar o marcador. A Bookmark só pode ser retomado quando o fluxo de trabalho estiver ocioso e, se o fluxo de trabalho não estiver ocioso, a chamada para ResumeBookmark será bloqueada até que o fluxo de trabalho fique ocioso.
Resultado da retomada do marcador
ResumeBookmark Retorna um BookmarkResumptionResult valor de enumeração para indicar os resultados da solicitação de retomada do marcador. Os valores de retorno possíveis são Success, NotReady, e NotFound. Hosts e extensões podem usar esse valor para determinar como proceder.