2017-03-09 66 views
0

我實現了一個簡單的WorkItemChangedEventHandler的TFS 2015年TFS服務器端插件啓動兩次

在我的TFS 2015年快速測試安裝,事件處理程序獲取實例化兩次。第一個實例是在TFS識別出由於新構建而導致的BinDirChangeOrDirectoryRename後立即創建的。第二個實例是在第一次訪問數據庫之後創建的。

鑑於此源代碼(注意,只有構造函數相關的):

​​

我碰到下面的事件記錄:

Information 09.03.2017 17:37:16 TFS Services  9002 None The application is being shutdown for the following reason: BinDirChangeOrDirectoryRename 
Information 09.03.2017 17:37:23 TFS Services  0  None New Plugin Instance Created with Hash 44661510 
Information 09.03.2017 17:37:24 TFS Services  9001 None Application Request Processing Started 
Information 09.03.2017 17:37:58 MSSQL$SQLEXPRESS 17137 Server Starting up database 'Tfs_DefaultCollection'. 
Information 09.03.2017 17:37:58 TFS Services  0  None New Plugin Instance Created with Hash 27996961 

難道這在TFS 2015年或錯誤我想念什麼?

+1

當一個事件來通過調用兩次你的代碼? –

+0

事件只發射一次。感謝提示。但是,我必須重新設計我的事件處理程序,因爲它需要創建後臺線程來觸發延遲更新過程。沒有必要同時運行兩個這樣的線程。 – freefall

+0

爲什麼不把它作爲服務鉤子而不是服務器端插件來實現? –

回答

1

我測試過在我的身邊你的代碼,並發現事件日誌中寫道:「新的插件實例創建與哈希XXXXXX」不時,不只是兩次(對不起,我無法找出爲什麼出現這種情況)。

但是,如果在ProcessEvent中添加EventLog.WriteEntry,則行爲是正確的。當工作項目被改變,將有一個在事件日誌中只有一個條目:

using System; 
using System.Diagnostics; 
using Microsoft.TeamFoundation.Common; 
using Microsoft.TeamFoundation.Framework.Server; 
using Microsoft.TeamFoundation.WorkItemTracking.Server; 

namespace MyFirstTfsPlugin 
{ 
    public class TfsTriggerConfluenceUpdateOnWorkItemChanged : ISubscriber 
    { 
       //public TfsTriggerConfluenceUpdateOnWorkItemChanged() 
    //{ 
    // EventLog.WriteEntry("TFS Services 1", $"New Plugin Instance Created with Hash {GetHashCode()}"); 
    //} 

     public string Name => "WorkItemChangedEventHandler"; 

     public SubscriberPriority Priority => SubscriberPriority.Normal; 

     public Type[] SubscribedTypes() => new[] { typeof(WorkItemChangedEvent) }; 

     public EventNotificationStatus ProcessEvent(
      IVssRequestContext requestContext, 
      NotificationType notificationType, 
      object notificationEventArgs, 
      out int statusCode, 
      out string statusMessage, 
      out ExceptionPropertyCollection properties) 
     { 
      EventLog.WriteEntry("TFS Services 2", $"workitem Created with Hash {GetHashCode()}"); 
      statusCode = 0; 
      properties = null; 
      statusMessage = String.Empty; 
      return EventNotificationStatus.ActionPermitted; 
     } 
    } 
} 

enter image description here