次の方法で共有


ブックマーク

ブックマークは、アクティビティがワークフロー スレッドを保持せずに入力を受動的に待機できるようにするメカニズムです。 アクティビティが刺激を待機していることを通知すると、ブックマークを作成できます。 これは、( Bookmarkを作成した) 現在実行中のメソッドが戻った場合でも、アクティビティの実行が完了したと見なしてはならないことをランタイムに示します。

ブックマークの基本

Bookmarkは、ワークフロー インスタンス内で実行を再開 (および入力を配信できる) ポイントを表します。 通常、 Bookmark には名前が付けられます。外部 (ホストまたは拡張機能) コードは、関連するデータを含むブックマークの再開を担当します。 Bookmarkが再開されると、ワークフロー ランタイムは、作成時にそのBookmarkに関連付けられたBookmarkCallback デリゲートをスケジュールします。

ブックマーク オプション

BookmarkOptions クラスは、作成するBookmarkの型を指定します。 可能な非相互排他的値は、 NoneMultipleResume、および NonBlockingです。 1 回だけ再開することが予想されるBookmarkを作成するときは、既定の None を使用します。 複数回再開できるBookmarkを作成するときは、MultipleResumeを使用します。 再開されない可能性があるBookmarkを作成するときは、NonBlockingを使用します。 既定の BookmarkOptionsを使用して作成されたブックマークとは異なり、 NonBlocking ブックマークはアクティビティの完了を妨げるものではありません。

ブックマークの再開

ブックマークは、 ResumeBookmark オーバーロードのいずれかを使用して、ワークフロー外のコードによって再開できます。 この例では、 ReadLine アクティビティが作成されます。 実行されると、 ReadLine アクティビティによって Bookmarkが作成され、コールバックが登録され、 Bookmark が再開されるまで待機します。 再開されると、 ReadLine アクティビティは、 Bookmark と共に渡されたデータをその 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);  
    }  
}  

この例では、 ReadLine アクティビティを使用してユーザーの名前を収集し、コンソール ウィンドウに表示するワークフローを作成します。 ホスト アプリケーションは、入力を収集する実際の作業を実行し、 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();  

ReadLine アクティビティが実行されると、UserNameという名前のBookmarkが作成され、ブックマークが再開されるまで待機します。 ホストは目的のデータを収集し、 Bookmarkを再開します。 ワークフローが再開され、名前が表示され、完了します。 ブックマークの再開に関しては、同期コードは必要ありません。 Bookmarkは、ワークフローがアイドル状態の場合にのみ再開でき、ワークフローがアイドル状態でない場合は、ワークフローがアイドルになるまでResumeBookmarkの呼び出しがブロックされます。

ブックマーク再開の結果

ResumeBookmark は、ブックマークの再開要求の結果を示す BookmarkResumptionResult 列挙値を返します。 可能な戻り値は、 SuccessNotReady、および NotFoundです。 ホストと拡張機能は、この値を使用して続行方法を決定できます。