Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Záložky jsou mechanismus, který aktivitě umožňuje pasivně čekat na vstup, aniž by držel vlákno procesního toku. Když aktivita signalizuje, že čeká na podněty, může vytvořit záložku. To naznačuje běhovému prostředí, že provádění aktivity by nemělo být považováno za dokončené, i když se aktuálně spuštěná metoda (která vytvořila Bookmark) vrátí.
Základy záložek
A Bookmark představuje místo, kde lze v instanci pracovního postupu obnovit provádění a skrze něj lze poskytovat vstupy. Typicky, Bookmark má pojmenování a externí kód (hostitele nebo rozšíření) je zodpovědný za obnovení záložky s relevantními daty. Po obnovení Bookmark modul runtime pracovního postupu naplánuje delegáta BookmarkCallback, který byl přidružený k Bookmark v době jeho vytvoření.
Možnosti záložek
Třída BookmarkOptions určuje typ Bookmark vytváření. Možné vzájemně se vylučující hodnoty jsou None, MultipleResumea NonBlocking. Použijte None, výchozí hodnotu, při vytváření Bookmark, který má být obnoven přesně jednou. Používá se MultipleResume při vytváření Bookmark , které lze obnovit vícekrát. Při vytváření NonBlocking, které nemusí být nikdy obnoveno, použijte Bookmark. Na rozdíl od záložek vytvořených pomocí výchozího nastavení BookmarkOptions nezabrání záložky NonBlocking dokončení aktivity.
Obnovení záložky
Záložky lze obnovit kódem mimo pracovní postup za použití jednoho z přetížení ResumeBookmark. V tomto příkladu je vytvořena ReadLine aktivita. Při spuštění ReadLine aktivita vytvoří Bookmark, zaregistruje zpětné volání a pak čeká, až bude Bookmark obnoveno. Když se obnoví, aktivita ReadLine přiřadí data, která byla předána s Bookmark, ke svému argumentu 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);
}
}
V tomto příkladu se vytvoří pracovní postup, který pomocí ReadLine aktivity shromáždí jméno uživatele a zobrazí ho v okně konzoly. Hostitelská aplikace provádí skutečnou práci shromažďování vstupu a předává ji pracovnímu postupu obnovením 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();
Když se ReadLine aktivita spustí, nejprve pojmenuje Bookmark na UserName a pak počká, až se záložka obnoví. Hostitel shromáždí požadovaná data a pak obnoví Bookmark. Pracovní postup se obnoví, zobrazí název a pak se dokončí. Mějte na paměti, že k obnovení záložky není nutný žádný synchronizační kód. A Bookmark lze obnovit pouze když je pracovní postup nečinný, a pokud pracovní postup není nečinný, volání ResumeBookmark blokuje, dokud pracovní postup nebude nečinný.
Výsledek obnovení záložky
ResumeBookmark BookmarkResumptionResult vrátí hodnotu výčtu, která označuje výsledky požadavku na obnovení záložky. Možné návratové hodnoty jsou Success, NotReadya NotFound. Hostitelé a rozšíření mohou tuto hodnotu použít k určení dalšího postupu.