Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Bladwijzers zijn het mechanisme waarmee een activiteit passief kan wachten op invoer zonder vast te houden aan een werkstroomthread. Wanneer een activiteit aangeeft dat er wordt gewacht op prikkels, kan er een bladwijzer worden gemaakt. Dit geeft aan de runtime aan dat de uitvoering van de activiteit niet als voltooid moet worden beschouwd, zelfs niet wanneer de momenteel uitgevoerde methode (die de methode Bookmarkheeft gemaakt) retourneert.
Basisbeginselen van bladwijzers
Een Bookmark vertegenwoordigt een punt waarop de uitvoering kan worden hervat (en waarlangs gegevensinvoer kan worden geleverd) binnen een werkstroominstantie. Normaal gesproken krijgt een Bookmark een naam en is externe (host- of extensie-)code verantwoordelijk voor het opnieuw starten van de bladwijzer met relevante gegevens. Wanneer een Bookmark wordt hervat, plant de werkstroomruntime de BookmarkCallback delegate die bij dat Bookmark hoort bij zijn creatie.
Opties voor bladwijzers
De BookmarkOptions klasse specificeert het type Bookmark dat wordt gemaakt. De mogelijke niet-wederzijds exclusieve waarden zijn None, MultipleResumeen NonBlocking. Gebruik None, de standaardwaarde bij het maken van een Bookmark die naar verwachting exact één keer wordt hervat. Gebruik MultipleResume wanneer u een Bookmark maakt dat meerdere keren hervat kan worden. Gebruik NonBlocking bij het maken van een Bookmark dat mogelijk nooit wordt hervat. In tegenstelling tot bladwijzers die zijn gemaakt met de standaardwaarde BookmarkOptions, NonBlocking verhinderen bladwijzers niet dat een activiteit wordt voltooid.
Hervatting van bladwijzer
Bladwijzers kunnen worden hervat door code buiten een workflow met behulp van een van de ResumeBookmark overloads. In dit voorbeeld wordt een ReadLine activiteit gemaakt. Wanneer de ReadLine activiteit wordt uitgevoerd, wordt er een Bookmark aangemaakt, wordt er een callback geregistreerd en wordt gewacht totdat de Bookmark activiteit is hervat. Wanneer de ReadLine activiteit wordt hervat, wijst deze de gegevens die met de Bookmark zijn doorgegeven toe aan zijn Result argument.
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 dit voorbeeld wordt een workflow gemaakt die de ReadLine activiteit gebruikt om de naam van de gebruiker te verzamelen en weer te geven in het consolevenster. De hosttoepassing voert de daadwerkelijke taak uit van het verzamelen van de invoer en geeft deze door aan de workflow door de Bookmark te hervatten.
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();
Wanneer de ReadLine activiteit wordt uitgevoerd, wordt er een Bookmark genaamd UserName gemaakt en wordt er gewacht totdat de bladwijzer is hervat. De host verzamelt de gewenste gegevens en hervat vervolgens de Bookmark. De werkstroom wordt hervat, de naam wordt weergegeven en vervolgens voltooid. Houd er rekening mee dat er geen synchronisatiecode is vereist met betrekking tot het hervatten van de bladwijzer. Een Bookmark kan alleen worden hervat wanneer de werkstroom inactief is en als de werkstroom niet inactief is, blokkeert de aanroep naar ResumeBookmark totdat de werkstroom inactief wordt.
Resultaat van hervatting van bladwijzer
ResumeBookmark retourneert een BookmarkResumptionResult opsommingswaarde om de resultaten van de aanvraag voor het hervatten van bladwijzers aan te geven. De mogelijke retourwaarden zijn Success, NotReadyen NotFound. Hosts en extensies kunnen deze waarde gebruiken om te bepalen hoe u doorgaat.