首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WF 4.0 書籤恢復實戰:使用 IWorkflowInstanceExtension 在 WorkflowInvoker/ServiceHost 中喚醒

     編輯:關於.NET

WF 4.0 中 NativeActivity 可建立書籤 (Bookmark) 暫停工作流。WorkflowApplication 直接支援 ResumeBookmark,但 WorkflowInvoker 與 WorkflowServiceHost 無此方法。解決方案:實作 IWorkflowInstanceExtension 取得 WorkflowInstanceProxy 代理物件,透過它恢復書籤。

擴充類別實作

class MyExtension : IWorkflowInstanceExtension {
    private WorkflowInstanceProxy _instance;

    public IEnumerable GetAdditionalExtensions() => null;

    public void SetInstance(WorkflowInstanceProxy instance) {
        _instance = instance; // 執行期注入代理
    }

    public void WaitSome(Bookmark bookmark) {
        ThreadPool.QueueUserWorkItem(_ => {
            Thread.Sleep(1000); // 模擬非同步等待
            var ias = _instance.BeginResumeBookmark(bookmark, 42, null, null);
            var result = _instance.EndResumeBookmark(ias);
            Console.WriteLine($"BookmarkResumptionResult: '{result}'");
        });
    }
}


活動整合擴充: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 非同步恢復 API
  • 活動透過 context.GetExtension<T>() 取得擴充,協調書籤建立與恢復

此模式適用於任何需在活動內部發起外部非同步操作並回呼工作流的場景 (如人工審核、外部服務輪詢)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved