Bookmark (書籤) 是 WF4.0 實現「暫停等待外部信號」的核心機制。活動建立書籤後,工作流進入 Idle 狀態,宿主可透過 ResumeBookmark 傳入資料喚醒流程繼續執行,支援無回傳值與泛型回傳值兩種模式。
public sealed class NoResultBookmark : NativeActivity
{
public InArgument<string> BookmarkName { get; set; }
protected override bool CanInduceIdle => true;
protected override void Execute(NativeActivityContext context)
{
context.CreateBookmark(context.GetValue(BookmarkName));
Console.WriteLine($"建立書籤: {context.GetValue(BookmarkName)}");
}
}
流程與結果:

public sealed class ResultBookmark<T> : NativeActivity<T>
{
public InArgument<string> BookmarkName { get; set; }
protected override bool CanInduceIdle => true;
protected override void Execute(NativeActivityContext context)
{
context.CreateBookmark(context.GetValue(BookmarkName), BookmarkCallback);
}
void BookmarkCallback(NativeActivityContext context, Bookmark bookmark, object obj)
{
this.Result.Set(context, (T)obj);
}
}
流程與結果:

流程:Parallel 分支各建立不同名稱書籤,宿主可任意順序喚醒。
結果:
參數/變數/流程:

結果:每個集合項目並行建立書籤,宿主逐一喚醒。
將 ParallelForEach 換為 ForEach,書籤按序建立與喚醒。

範例下載:BookmarkSample.rar