2011-09-08 15 views
0

我們rying使用WF由基本聽不同的查詢多個跟蹤參與者 - 一個用於活動狀態,一個用於定製tracknig記錄這是CustomTrackingRecord的子類。多個TrackingParticipants不工作,有有趣的副作用?

的問題是,我們可以利用來逐個既TrackingParticipants,卻不能在一起 - 我們永遠不會從CustomTrackingRecord但是A CustomTrackingRecord讓我們的子類。

如果我把bopth查詢到一個TrackingParticipant,然後在一個處理everythign,既很好地工作(這表明德錯誤是不是我們把它們)。

在合併一個問題的代碼是:

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.

回答

2

我想我encounterad完全相同的問題。 由於擴展機制的限制而發生此問題。每個工作流程實例的每個擴展類型只能有一個實例(根據Microsoft的文檔)。足夠有趣,雖然,一個可以添加相同類型的多個實例,以一個工作流的擴展,它 - 在TrackingParticipant衍生物的情況下 - 導致怪異的行爲,因爲只有他們跟蹤一個配置文件用於各類型的所有參與者,但他們所有的覆蓋的Track方法正在被調用。 有一個(恕我直言)醜陋的解決方法是:從獲得一個TrackingParticipant新的參與者類爲每個任務(TASK1,TASK2,日誌記錄...)

問候, 雅各

+0

你有一個鏈接到你referrring的文檔?我很樂意閱讀那一個。其實我不是一個超級追隨者在一個班級裏做所有事情的,並且它很好。 – TomTom

+1

我遇到同樣的問題。 ** MSDN blog words:**「在WF 4中,多個跟蹤參與者可以同時使用跟蹤事件,每個跟蹤參與者可以與不同的跟蹤配置文件相關聯。」我不相信這是真的。 http://blogs.msdn.com/b/endpoint/archive/2009/07/14/tracking-participants-in-net-4-beta-1.aspx –

0

我認爲這個問題ISN 「T通過擴展機制引起的,因爲DerivedParticipant 和DerivedParticipant 不是同一類型(WF內部只使用多態性上的基類)。

我在同一個問題上運行,我的Derived1正在跟蹤未在其配置文件中描述的記錄。

Derived1.TrackingProfile.Name"Foo"Derived2.TrackingProfile.Namenull

我從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; 
} 
相關問題