Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
I segnalibri sono il meccanismo che consente a un'attività di attendere passivamente l'input senza tenere premuto un thread del flusso di lavoro. Quando un'attività segnala che è in attesa di stimoli, può creare un segnalibro. Ciò indica al runtime che l'esecuzione dell'attività non deve essere considerata completa anche quando il metodo, attualmente in esecuzione, che ha creato Bookmark, restituisce.
Nozioni di base sul segnalibro
Un Bookmark rappresenta un punto in cui l'esecuzione può essere ripresa (e tramite cui è possibile recapitare l'input) all'interno di un'istanza del flusso di lavoro. In genere, a un Bookmark oggetto viene assegnato un nome e un codice esterno (host o estensione) è responsabile della ripresa del segnalibro con i dati pertinenti. Quando viene ripreso un oggetto Bookmark, il runtime del flusso di lavoro pianifica il delegato BookmarkCallback associato a tale oggetto Bookmark al momento della creazione.
Opzioni segnalibro
La classe BookmarkOptions specifica il tipo di Bookmark che sta venendo creato. I possibili valori non esclusivi a vicenda sono None, MultipleResumee NonBlocking. Usare None, l'impostazione predefinita, quando si crea un oggetto Bookmark che dovrebbe essere ripreso esattamente una volta. Usare MultipleResume quando si crea un Bookmark che può essere ripreso più volte. Usare NonBlocking quando si crea un Bookmark che potrebbe non essere mai ripreso. A differenza dei segnalibri creati usando l'impostazione predefinita BookmarkOptions, NonBlocking i segnalibri non impediscono il completamento di un'attività.
Ripristino del segnalibro
I segnalibri possono essere ripresi dal codice all'esterno di un flusso di lavoro usando uno degli ResumeBookmark overload. In questo esempio viene creata un'attività ReadLine . Quando viene eseguita, l'attività ReadLine crea un Bookmark, registra un callback e quindi attende che il Bookmark venga ripreso. Quando viene ripresa, l'attività ReadLine assegna i dati passati con l'Bookmark al relativo argomento Result.
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);
}
}
In questo esempio viene creato un flusso di lavoro che usa l'attività ReadLine per raccogliere il nome dell'utente e visualizzarlo nella finestra della console. L'applicazione host esegue il reale lavoro di raccolta dell'input e lo passa al flusso di lavoro riprendendo il processo 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 viene eseguita l'attività ReadLine, crea un Bookmark denominato UserName e quindi attende che il segnalibro venga ripreso. L'host raccoglie i dati desiderati e quindi riprende il Bookmark. Il flusso di lavoro riprende, visualizza il nome e quindi viene completato. Si noti che non è necessario alcun codice di sincronizzazione per quanto riguarda la ripresa del segnalibro. Un Bookmark può essere ripreso solo quando il flusso di lavoro è inattivo e, se il flusso di lavoro non è inattivo, la chiamata a ResumeBookmark blocca fino a quando il flusso di lavoro diventa inattivo.
Risultato ripresa segnalibro
ResumeBookmark restituisce un BookmarkResumptionResult valore di enumerazione per indicare i risultati della richiesta di ripresa del segnalibro. I valori restituiti possibili sono Success, NotReadye NotFound. Gli host e le estensioni possono usare questo valore per determinare come procedere.