Workflow foundation 4 多个跟踪参与者不工作,是否有有趣的副作用?
我们正在尝试将WF用于多个跟踪参与者,这些参与者基本上会侦听不同的查询—一个用于活动状态,一个用于CustomTrackingRecord的子类CustomTrackingRecords 问题是,我们可以单独使用两个TrackingParticipants,但不能同时使用——我们永远不会从CustomTrackingRecord获得子类,而是从CustomTrackingRecord获得子类 如果我将bopth查询放在一个TrackingParticipant中,然后在一个中处理所有签名,那么这两个查询都可以完美地工作(这表明错误不是我们抛出它们的地方) 合并后的代码为:Workflow foundation 4 多个跟踪参与者不工作,是否有有趣的副作用?,workflow-foundation-4,Workflow Foundation 4,我们正在尝试将WF用于多个跟踪参与者,这些参与者基本上会侦听不同的查询—一个用于活动状态,一个用于CustomTrackingRecord的子类CustomTrackingRecords 问题是,我们可以单独使用两个TrackingParticipants,但不能同时使用——我们永远不会从CustomTrackingRecord获得子类,而是从CustomTrackingRecord获得子类 如果我将bopth查询放在一个TrackingParticipant中,然后在一个中处理所有签名,那么这
public WorkflowServiceTrackingParticipant ()
{
this.TrackingProfile = new TrackingProfile()
{
ActivityDefinitionId = "*",
ImplementationVisibility = ImplementationVisibility.All,
Name = "WorkflowServiceTrackingProfile",
Queries = {
new CustomTrackingQuery() { Name = "*", ActivityName = "*" },
new ActivityStateQuery() {
States = {
ActivityStates.Canceled,
ActivityStates.Closed,
ActivityStates.Executing,
ActivityStates.Faulted
}
},
}
};
}
当使用两个TrackingParticipants时,我们有两个TrackingProfile(名称不同),每个都有一个查询
在“轨迹法”中,使用两条单独的线时,线:
protected override void Track(TrackingRecord record, TimeSpan timeout)
{
Console.WriteLine("*** ActivityTracking: " + record.GetType());
if (record is ActivityBasedTrackingRecord)
{
System.Diagnostics.Debugger.Break();
}
永远不要导致调试器命中,当只使用一个来跟踪CustomTrackingRecord子类(ActivityBasedTrackingRecord)时,调试器就会工作
还有人知道这件事吗?目前,我们已经将两个TrackingParticipants合并为一个,但这有一个坏的副作用,即我们无法动态地扩展日志记录的可能性,我们希望这样做。这是世界自然基金会的已知问题吗
使用的版本:4.0 Sp1功能更新1。我想我遇到了完全相同的问题。 出现此问题的原因是扩展机制的限制。每个工作流实例的每个扩展类型只能有一个实例(根据Microsoft文档)。有趣的是,可以将同一类型的多个实例添加到一个工作流的扩展中,在TrackingParticipant派生的情况下,这会导致奇怪的行为,因为只有一个跟踪配置文件用于各自类型的所有参与者,但会调用它们对Track方法的所有重写。 有一个(imho)难看的解决方法:从TrackingParticipant为每个任务派生一个新的参与者类(task1、task2、logging…) 问候,,
Jacob我认为这个问题不是由扩展机制引起的,因为DerivedParticipant1和DerivedParticipant2不是同一类型(WF内部只在基类上使用多态性) 我正在运行同一个问题,我的Derived1正在跟踪其配置文件中没有描述的记录 Derived1.TrackingProfile.Name是
“Foo”
,Derived2.TrackingProfile.Name是null
我将名称从null
更改为“Bar”
,并按预期工作
下面是一个WF内部参考代码,描述如何选择配置文件
// System.Activities.Tracking.RuntimeTrackingProfile.RuntimeTrackingProfileCache
public RuntimeTrackingProfile GetRuntimeTrackingProfile(TrackingProfile profile, Activity rootElement)
{
RuntimeTrackingProfile runtimeTrackingProfile = null;
HybridCollection<RuntimeTrackingProfile> hybridCollection = null;
lock (this.cache)
{
if (!this.cache.TryGetValue(rootElement, out hybridCollection))
{
runtimeTrackingProfile = new RuntimeTrackingProfile(profile, rootElement);
hybridCollection = new HybridCollection<RuntimeTrackingProfile>();
hybridCollection.Add(runtimeTrackingProfile);
this.cache.Add(rootElement, hybridCollection);
}
else
{
ReadOnlyCollection<RuntimeTrackingProfile> readOnlyCollection = hybridCollection.AsReadOnly();
foreach (RuntimeTrackingProfile current in readOnlyCollection)
{
if (string.CompareOrdinal(profile.Name, current.associatedProfile.Name) == 0 && string.CompareOrdinal(profile.ActivityDefinitionId, current.associatedProfile.ActivityDefinitionId) == 0)
{
runtimeTrackingProfile = current;
break;
}
}
if (runtimeTrackingProfile == null)
{
runtimeTrackingProfile = new RuntimeTrackingProfile(profile, rootElement);
hybridCollection.Add(runtimeTrackingProfile);
}
}
}
return runtimeTrackingProfile;
}
//System.Activities.Tracking.RuntimeTrackingProfile.RuntimeTrackingProfileCache
公共RuntimeTrackingProfile GetRuntimeTrackingProfile(TrackingProfile配置文件,活动根元素)
{
RuntimeTrackingProfile RuntimeTrackingProfile=null;
HybridCollection HybridCollection=null;
锁(this.cache)
{
if(!this.cache.TryGetValue(rootElement,out hybridCollection))
{
runtimeTrackingProfile=新的runtimeTrackingProfile(profile,rootElement);
hybridCollection=新hybridCollection();
添加(runtimeTrackingProfile);
this.cache.Add(rootElement,hybridCollection);
}
其他的
{
ReadOnlyCollection ReadOnlyCollection=hybridCollection.AsReadOnly();
foreach(RuntimeTrackingProfile当前在readOnlyCollection中)
{
if(string.CompareOrdinal(profile.Name,current.associatedProfile.Name)==0&&string.CompareOrdinal(profile.ActivityDefinitionId,current.associatedProfile.ActivityDefinitionId)==0)
{
runtimeTrackingProfile=当前;
打破
}
}
if(runtimeTrackingProfile==null)
{
runtimeTrackingProfile=新的runtimeTrackingProfile(profile,rootElement);
添加(runtimeTrackingProfile);
}
}
}
返回runtimeTrackingProfile;
}
您是否有指向所参考文档的链接?我很想读那本。事实上,我不是一个超级田径运动员,在一节课上做所有的事情,而且效果很好。我也有同样的问题。MSDN博客文字:“在WF4中,多个跟踪参与者可以同时使用跟踪事件。每个跟踪参与者可以与不同的跟踪配置文件关联。”我不相信这是真的。