我正在尝试实现一个WF4活动扩展,它可以处理一些长时间运行的数据处理,并不时地将信息发送回“母亲”活动。
我实现了这个版本,但是如果我在并行活动上下文中使用此活动,则会遇到问题。从下面的代码中可以看出,活动正在创建一个书签,并在调用MyActivityExtension对象之后。 我希望MyActivity类的每个实例都有一个不同的MyActivityExtension实例来与之通信。如果在一个工作流定义中使用此类型的两个活动,则一切正常,并且对扩展类的调用是针对不同的对象,但是如果一个活动开始执行而另一个活动空闲,则第二个活动使用相同的扩展实例,如闲人的。
下面我添加了一个简化的代码示例。知道如何在活动实例和活动扩展实例之间建立一对一的关系吗?
提前谢谢你, 亚历
MyActivity代码:
protected override void Execute(NativeActivityContext context)
{
//Some data processing....
//Obtain the activity extension
MyActivityExtension extension = context.GetExtension<MyActivityExtension >();
string bookmarkName = "MyActivity_" + Guid.NewGuid().ToString();
var bookmark = context.CreateBookmark(bookmarkName, BookmarkResumed);
extension.ProcessData(bookmarkName);
}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
metadata.AddDefaultExtensionProvider<MyActivityExtension >(() => new MyActivityExtension ());
}
private void BookmarkResumed(NativeActivityContext context, Bookmark bookmark, object value)
{
//some data retrieving operations
}
MyActivityExtension代码:
public class MyActivityExtension : IWorkflowInstanceExtension
{
private WorkflowInstanceProxy instance;
private Guid id;
public MyActivityExtension()
{
id = Guid.NewGuid();
}
internal void ProcessData(string bookmarkName)
{
Console.WriteLine("My activity extension Id: " + id.ToString());
//Some data processing
}
public IEnumerable<object> GetAdditionalExtensions()
{
return null;
}
public void SetInstance(WorkflowInstanceProxy instance)
{
this.instance = instance;
}
}
答案 0 :(得分:1)
IWorkflowInstanceExtension有助于对一个工作流关系进行一次扩展,但您发现的每个活动将共享相同的扩展。没有开箱即用的方法为每个活动创建新的扩展。我要做的是将扩展名更改为某种扩展工厂,并使用Create()函数返回一个新对象。
所以你的代码看起来像这样:
protected override void Execute(NativeActivityContext context)
{
//Some data processing....
//Obtain the activity extension
MyActivityExtensionFactory extensionFactory = context.GetExtension<MyActivityExtensionFactory >();
MyActivityExtension extension = extensionFactory.Create();
string bookmarkName = "MyActivity_" + Guid.NewGuid().ToString();
var bookmark = context.CreateBookmark(bookmarkName, BookmarkResumed);
extension.ProcessData(bookmarkName);
}