Záložky
Záložky jsou mechanismus, který aktivitě umožňuje pasivní čekání na vstup bez podržení na vlákno pracovního postupu. Když aktivita signalizuje, že čeká na podněty, může vytvořit záložku. To značí modulu runtime, že provádění aktivity by nemělo být považováno za dokončené, i když aktuálně spuštěná metoda (která vytvořila Bookmark) vrátí.
Základy záložek
A Bookmark představuje bod, kdy je možné v instanci pracovního postupu obnovit provádění (a prostřednictvím kterého vstupu lze doručit). Za obnovení záložky s relevantními daty Bookmark obvykle zodpovídá za pojmenování a externí kód (hostitele nebo rozšíření). Bookmark Po obnovení naplánuje modul runtime BookmarkCallback pracovního postupu delegáta, který byl přidružený k Bookmark sadě v době jejího 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 Nonevýchozí hodnotu při vytváření očekávaného Bookmark obnovení přesně jednou. Používá se MultipleResume při vytváření Bookmark , které lze obnovit vícekrát. Používá se NonBlocking při vytváření Bookmark , které se nemusí nikdy obnovit. Na rozdíl od záložek vytvořených pomocí výchozího nastavení BookmarkOptionsNonBlocking nezabrání dokončení aktivity.
Obnovení záložky
Záložky lze obnovit kódem mimo pracovní postup pomocí jednoho z ResumeBookmark přetížení. V tomto příkladu ReadLine
se vytvoří aktivita. Při spuštění ReadLine
aktivita vytvoří Bookmark, zaregistruje zpětné volání a pak čeká na Bookmark obnovení. Když se obnoví, ReadLine
aktivita přiřadí data, která byla předána s argumentem BookmarkResult .
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í, vytvoří pojmenovanou BookmarkUserName
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 v případě nečinnosti pracovního postupu a pokud pracovní postup není nečinný, volání bloků ResumeBookmark , dokud pracovní postup nebude nečinný.
Výsledek obnovení záložky
ResumeBookmarkBookmarkResumptionResult 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í můžou tuto hodnotu použít k určení postupu.