WF 4.0 中 NativeActivity 可建立書籤 (Bookmark) 暫停工作流。WorkflowApplication 直接支援 ResumeBookmark,但 WorkflowInvoker 與 WorkflowServiceHost 無此方法。解決方案:實作 IWorkflowInstanceExtension 取得 WorkflowInstanceProxy 代理物件,透過它恢復書籤。
class MyExtension : IWorkflowInstanceExtension {
private WorkflowInstanceProxy _instance;
public IEnumerable
CacheMetadata 註冊預設提供者public class MyBookmarkedActivity : NativeActivity {
protected override void CacheMetadata(NativeActivityMetadata metadata) {
base.CacheMetadata(metadata);
metadata.AddDefaultExtensionProvider<MyExtension>(() => new MyExtension());
}
protected override bool CanInduceIdle => true; // 宣告可能閒置
protected override void Execute(NativeActivityContext context) {
var bookmark = context.CreateBookmark("MyBookmark", BookmarkResumed);
var ext = context.GetExtension<MyExtension>();
ext.WaitSome(bookmark); // 觸發非同步恢復
}
private void BookmarkResumed(NativeActivityContext context, Bookmark bookmark, object value) {
Console.WriteLine($"Bookmark resumed with '{value}'.");
}
}
// 1. WorkflowInvoker (單機同步/非同步)
WorkflowInvoker.Invoke(new MyBookmarkedActivity());
// 2. WorkflowServiceHost (WCF 服務)
var host = new WorkflowServiceHost(new MyBookmarkedActivity());
host.AddDefaultEndpoints();
host.Open();
Console.WriteLine("Listening...");
Console.ReadLine();
host.Close();
// 3. WorkflowApplication (原生支援 ResumeBookmark)
// 參考前文,此處不再贅述
關鍵點:AddDefaultExtensionProvider 確保活動執行時自動獲得擴充實例,無需外部組態設定。
IWorkflowInstanceExtension 讓擴充物件「感知」工作流執行個體SetInstance 注入 WorkflowInstanceProxy,提供 Begin/EndResumeBookmark 非同步恢復 APIcontext.GetExtension<T>() 取得擴充,協調書籤建立與恢復此模式適用於任何需在活動內部發起外部非同步操作並回呼工作流的場景 (如人工審核、外部服務輪詢)。