程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 在WF4.0中使用IWorkflowInstanceExtension恢復書簽

在WF4.0中使用IWorkflowInstanceExtension恢復書簽

編輯:關於.NET

在前一篇文章中,我介紹了如何通過使用NativeActivity創建一個異步的活動以及創建書簽來暫停工作流的執行。在 WorkflowApplication中使用書簽非常的容易,在WorkflowInvoker 和WorkflowServiceHost中呢?

如何使用WorkflowInvoker和WorkflowServiceHost?

WorkflowInvoker 和WorkflowServiceHost中都沒有ResumeBookmark函數,那我們如何使用它們來恢復書簽呢?訣竅就是使IWorkflowInstanceExtension。

使用IWorkflowInstanceExtension

沒有基類和接口需要,工作流可以擴展成任何您想要的類型。但是那也意味它們不知道工作流運行時的環境,並且不能對來自工作流調用做出更多的反應。通過實現 IWorkflowInstanceExtension接口,能夠做到這些。這個接口有兩個方法。其中一個是SetInstance,通過在運行工作流周圍的一個封裝的對象允許我們完成很多工作。最重要是,這也能讓我們恢復書簽。

我的工作流擴展基本上是等待活動調用,一旦完成等待一秒鐘,恢復書簽.A

class MyExtension : IWorkflowInstanceExtension
{
    private WorkflowInstanceProxy _instance;
     public IEnumerable<object> GetAdditionalExtensions()
     {
       return null;
     }
    public void SetInstance(WorkflowInstanceProxy instance)
    {
       _instance = instance;
    }
     public void WaitSome(Bookmark bookmark)
     {
        ThreadPool.QueueUserWorkItem(state =>
         {
            Thread.Sleep(1000);
            var ias = _instance.BeginResumeBookmark(bookmark, 42, null,null);
            var result = _instance.EndResumeBookmark(ias);
            Console.WriteLine("BookmarkResumptionResult: '{0}'", result);
          }
);
  }
}

注意 GetAdditionalExtensions()函數返回null,因為我們沒有添加額外的擴展。

新版的活動

完成了必要的擴展,我們仍然需要確定它添加到工作流運行時的選擇。最簡單的選項是讓活動自己通過AddDefaultExtensionProvider()函數在CacheMetadata()函數中完成。新的活動如下所示:

public class MyBookmarkedActivity : NativeActivity
{
      protected override void CacheMetadata(NativeActivityMetadata metadata)
      {
         base.CacheMetadata(metadata);
         metadata.AddDefaultExtensionProvider<MyExtension>(() => new MyExtension());
      }
     protected override bool CanInduceIdle 
     {
           get
           {
              return true;
            }
      }
    protected override void Execute(NativeActivityContext context)
    {
          var bookmark = context.CreateBookmark("MyBookmark", BookmarkResumed);
          var extension = context.GetExtension<MyExtension>();        extension.WaitSome(bookmark);
    }
    private void BookmarkResumed(NativeActivityContext context, Bookmark bookmark, object value)
    {
         Console.WriteLine("Bookmark resumed with '{0}'.", value);
    }
}

為了運行活動,這是所有我們需要做的,它將自動地增加必需的擴展:

WorkflowInvoker.Invoke(new MyBookmarkedActivity());

或者使用WorkflowServiceHost:

var wsh = new WorkflowServiceHost(new MyBookmarkedActivity());
    wsh.AddDefaultEndpoints();
    wsh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    wsh.Close();

並且在案件中你知道的地方,兩者都沒有使用任何配置文件。

出處:http://zhuqil.cnblogs.com

原文:http://msmvps.com/blogs/theproblemsolver/archive/2010/01/27/using-wf4-bookmarks-with-iworkflowinstanceextension.aspx

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved