Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Zakładki to mechanizm, który umożliwia pasywne oczekiwanie na dane wejściowe bez utrzymywania wątku procesu pracy. Gdy działanie sygnalizuje, że oczekuje na bodźce, może utworzyć zakładkę. To wskazuje środowisku uruchomieniowemu, że wykonanie działania nie powinno być uznawane za zakończone, nawet gdy obecnie wykonywana metoda (która utworzyła Bookmark obiekt) zwróci wartość.
Podstawy zakładek
Element Bookmark reprezentuje punkt, w którym można wznowić wykonywanie (i za pomocą którego można dostarczyć dane wejściowe) w wystąpieniu przepływu pracy. Zazwyczaj Bookmark jest przypisywany nazwa, a zewnętrzny kod (hosta lub rozszerzenia) jest odpowiedzialny za wznowienie zakładki z odpowiednimi danymi. Gdy obiekt Bookmark zostanie wznowiony, środowisko uruchomieniowe przepływu pracy harmonogramuje delegata BookmarkCallback, który był z nim skojarzony w momencie jego utworzenia.
Opcje zakładki
Klasa BookmarkOptions określa typ tworzonego Bookmark elementu. Możliwe niewzajemnie wykluczające się wartości to None, MultipleResume i NonBlocking. Użyj None, wartości domyślnej, podczas tworzenia obiektu Bookmark, który ma zostać wznowiony dokładnie raz. Użyj MultipleResume przy tworzeniu Bookmark, który można wznowić wiele razy. Użyj NonBlocking podczas tworzenia Bookmark, który może nigdy nie zostać wznowiony. W przeciwieństwie do zakładek utworzonych przy użyciu domyślnego BookmarkOptions, zakładki NonBlocking nie uniemożliwiają ukończenia działania.
Wznowienie zakładek
Zakładki można wznowić za pomocą kodu spoza przepływu pracy przy użyciu jednego z przeciążeń ResumeBookmark. Utworzono aktywność ReadLine
w tym przykładzie. Gdy działanie ReadLine
zostanie wykonane, tworzy Bookmark, rejestruje wywołanie zwrotne, a następnie czeka na wznowienie Bookmark. Po wznowieniu działanie ReadLine
przypisuje dane przekazane za pomocą Bookmark do 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);
}
}
W tym przykładzie tworzony jest przepływ pracy, który używa działania ReadLine
do zbierania nazwy użytkownika i wyświetlania go w oknie konsoli. Aplikacja hosta wykonuje rzeczywistą pracę zbierania danych wejściowych i przekazuje ją do przepływu pracy, wznawiając operację 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();
Po wykonaniu działania ReadLine
tworzy Bookmark o nazwie UserName
, a następnie czeka na wznowienie zakładki. Host zbiera żądane dane, a następnie wznawia Bookmark. Przepływ pracy zostanie wznowiony, wyświetli nazwę, a następnie się zakończy. Należy pamiętać, że w odniesieniu do wznowienia zakładki nie jest wymagany żaden kod synchronizacji. Element Bookmark można wznowić tylko wtedy, gdy przepływ pracy jest bezczynny, i jeśli przepływ pracy nie jest bezczynny, wywołanie ResumeBookmark blokuje do momentu, aż przepływ pracy stanie się bezczynny.
Wynik przywrócenia zakładki
ResumeBookmark BookmarkResumptionResult Zwraca wartość wyliczenia, aby wskazać wyniki żądania wznowienia zakładki. Możliwe wartości zwracane to Success, NotReadyi NotFound. Hosty i rozszerzenia mogą używać tej wartości, aby określić, jak kontynuować.