Workflow foundation 4 多个跟踪参与者不工作,是否有有趣的副作用?

Workflow foundation 4 多个跟踪参与者不工作,是否有有趣的副作用?,workflow-foundation-4,Workflow Foundation 4,我们正在尝试将WF用于多个跟踪参与者,这些参与者基本上会侦听不同的查询—一个用于活动状态,一个用于CustomTrackingRecord的子类CustomTrackingRecords 问题是,我们可以单独使用两个TrackingParticipants,但不能同时使用——我们永远不会从CustomTrackingRecord获得子类,而是从CustomTrackingRecord获得子类 如果我将bopth查询放在一个TrackingParticipant中,然后在一个中处理所有签名,那么这

我们正在尝试将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中,多个跟踪参与者可以同时使用跟踪事件。每个跟踪参与者可以与不同的跟踪配置文件关联。”我不相信这是真的。