在前一篇文章中,我介绍了如何通过使用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,因为我们没有添加额外的扩展。