C# 活动-工作流实例扩展一对一关系
我正在尝试实现一个WF4活动扩展,它可以处理一些长时间运行的数据处理,并不时地将信息发送回“母亲”活动 我实现了这个版本,但是如果我在并行活动上下文中使用这个活动,我会遇到问题。从下面的代码可以看出,活动正在创建书签,并在调用MyActivityExtension对象之后。 我希望MyActivity类的每个实例都有一个不同的MyActivityExtension实例进行通信。如果在一个工作流定义中连续使用两个此类活动,则一切正常,并且对扩展类的调用针对不同的对象,但如果一个活动开始执行,而另一个活动处于空闲状态,则第二个活动将使用与空闲活动相同的扩展实例 下面我添加了一个简化的代码示例。知道如何在活动实例和活动扩展实例之间建立一对一的关系吗 提前谢谢大家,, 亚历克斯 我的活动代码:C# 活动-工作流实例扩展一对一关系,c#,.net,workflow-foundation-4,C#,.net,Workflow Foundation 4,我正在尝试实现一个WF4活动扩展,它可以处理一些长时间运行的数据处理,并不时地将信息发送回“母亲”活动 我实现了这个版本,但是如果我在并行活动上下文中使用这个活动,我会遇到问题。从下面的代码可以看出,活动正在创建书签,并在调用MyActivityExtension对象之后。 我希望MyActivity类的每个实例都有一个不同的MyActivityExtension实例进行通信。如果在一个工作流定义中连续使用两个此类活动,则一切正常,并且对扩展类的调用针对不同的对象,但如果一个活动开始执行,而另一
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
}
protected override void Execute(NativeActivityContext上下文)
{
//一些数据处理。。。。
//获取活动扩展名
MyActivityExtension=context.GetExtension();
字符串bookmarkName=“MyActivity_389;”+Guid.NewGuid().ToString();
var bookmark=context.CreateBookmark(bookmarkName,bookmark);
extension.ProcessData(书签名称);
}
受保护的覆盖无效缓存元数据(NativeActivityMetadata)
{
base.CacheMetadata(元数据);
AddDefaultExtensionProvider(()=>newMyActivityExtension());
}
private void Bookmark已恢复(NativeActivityContext上下文、书签书签、对象值)
{
//一些数据检索操作
}
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;
}
}
公共类MyActivityExtension:IWorkflowInstanceExtension
{
私有WorkflowInstanceProxy实例;
私有Guid id;
公共MyActivityExtension()
{
id=Guid.NewGuid();
}
内部void ProcessData(字符串书签名称)
{
WriteLine(“我的活动扩展Id:+Id.ToString());
//一些数据处理
}
公共IEnumerable GetAdditionalExtensions()
{
返回null;
}
公共void SetInstance(WorkflowInstanceProxy实例)
{
this.instance=instance;
}
}
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);
}
protected override void Execute(NativeActivityContext上下文)
{
//一些数据处理。。。。
//获取活动扩展名
MyActivityExtensionFactory extensionFactory=context.GetExtension();
MyActivityExtension=extensionFactory.Create();
字符串bookmarkName=“MyActivity_389;”+Guid.NewGuid().ToString();
var bookmark=context.CreateBookmark(bookmarkName,bookmark);
extension.ProcessData(书签名称);
}
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);
}
protected override void Execute(NativeActivityContext上下文)
{
//一些数据处理。。。。
//获取活动扩展名
MyActivityExtensionFactory extensionFactory=context.GetExtension();
MyActivityExtension=extensionFactory.Create();
字符串bookmarkName=“MyActivity_389;”+Guid.NewGuid().ToString();
var bookmark=context.CreateBookmark(bookmarkName,bookmark);
extension.ProcessData(书签名称);
}
好主意,莫里斯。我实现了一个扩展工厂并解决了这个问题。非常感谢。好主意,莫里斯。我实现了一个扩展工厂并解决了这个问题。非常感谢。