2011-09-08 2 views
0

우리는 기본적으로 여러 쿼리를 듣는 다중 추적 참가자와 함께 WF를 사용하려고합니다. 하나는 활동 상태이고 다른 하나는 CustomTrackingRecord의 하위 클래스 인 사용자 지정 tracknig 레코드입니다.여러 TrackingParticipants가 작동하지 않고 재미있는 부작용이 있습니까?

문제는 개별적으로 TrackingParticipant를 사용할 수 있지만 함께 사용하는 것이 아니라는 것입니다. 우리는 CustomTrackingRecord가 아닌 CustomTrackingRecord라는 하위 클래스를 사용하지 않습니다.

하나의 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이 각각 쿼리 중 하나가 있는지. 트랙 방법

, 모두 별도의 사용, 라인 : 우리 CustomTrackingRecord 서브 클래스 (ActivityBasedTrackingRecord) 다음 작동을 추적하기 위해 단지 하나를 사용하는 경우

protected override void Track(TrackingRecord record, TimeSpan timeout) 
    { 
     Console.WriteLine("*** ActivityTracking: " + record.GetType()); 
     if (record is ActivityBasedTrackingRecord) 
     { 
      System.Diagnostics.Debugger.Break(); 
     } 

디버거 타격, 발생하지 않았다.

누구든지 알고 있나요? 지금까지 두 TrackingParticipant를 하나로 결합했지만, 이로 인해 로깅 가능성을 동적으로 확장 할 수없는 부작용이 있습니다. WWF에서 알려진 문제인가요? 사용

버전 : 4.0 SP1을 기능 업데이트 1.

답변

2

은 내가 똑같은 문제를 encounterad 같아요. 이 문제는 확장 메커니즘의 제한 때문에 발생합니다. 워크 플로 인스턴스마다 확장 유형 당 하나의 인스턴스 만있을 수 있습니다 (Microsoft 설명서 참조). 충분히 흥미롭지 만 TrackingParticipant 파생물의 경우에는 하나의 워크 플로의 확장에 동일한 유형의 인스턴스를 여러 개 추가 할 수 있습니다. 추적 프로 파 일 중 하나만 해당 유형의 모든 참가자에게 사용되기 때문에 이상한 동작이 발생하지만 모든 재정의 Track 메서드가 호출됩니다. 이에 (이럴) 추한 해결 방법은 각 작업에 대한 TrackingParticipant에서 새 참가자 클래스를 파생 (작업 1, task2, 로그인 ...)

감사합니다, 야곱

+0

을 선택 묘사하고? 나는 그 것을 읽는 것을 좋아할 것이다. 사실 나는 하나의 클래스에서 모든 것을하는 super trackiong 참여자를 요구하지 않고 좋은 결과를 얻는다. – TomTom

+1

동일한 문제가 있습니다. ** MSDN 블로그 단어 : ** "WF 4에서는 여러 추적 참가자가 동시에 추적 이벤트를 사용할 수 있습니다. 각 추적 참가자는 다른 추적 프로필과 연결할 수 있습니다." 나는 그것이 사실이라고 믿지 않는다. http://blogs.msdn.com/b/endpoint/archive/2009/07/14/tracking-participants-in-net-4-beta-1.aspx –

0

내가 생각하는이 문제의 ISN DerivedParticipant 및 DerivedParticipant 은 확장 유형 메커니즘이 아니므로 WF 내부 구조는 기본 클래스에서 다형성을 사용합니다.

동일한 문제로 인해 내 Derived1이 프로필에 기록되지 않은 기록을 추적하고있었습니다.

Derived1.TrackingProfile.Name이 Derived2.TrackingProfile.Name"Foo"이었다에게

null 내가 "Bar"null에서 이름을 변경했다 예상대로 일했다.여기

WF 내부 참조 코드, 어떻게 프로필은 당신이 referrring하는 문서에 대한 링크가 있습니까

// 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; 
} 
관련 문제