2012-12-11 32 views
0

我們在Unity MVC3項目中使用Unity作爲我們的Io​​C容器。我們只安裝了dynatrace,它在FileSystemWatcher.StartRaisingEvents方法中顯示了花費的時間,特別是在ReadDirectoryChangesW中。這似乎是造成糟糕表現的原因。Unity IoC在ReadDirectoryChangesW中花費大量時間

Unity爲什麼要監視文件系統?

Here's the call stack: 

ChildActionExtensions.RenderAction 
    HttpServerUtility.Execute 
    HttpHandlerUtil+ServerExecuteHttpHandler.Wrap 
     UnityControllerFactory.CreateController 
     XmlConfigurator.ConfigureAndWatch 
      FileSystemWatcher.StartRaisingEvents 
      UnsafeNativeMethods.ReadDirectoryChangesW 

這裏是UnityControllerFactoryCode

 try 
     { 
      if (requestContext.RouteData.DataTokens.ContainsKey("area") && !string.IsNullOrWhiteSpace(requestContext.RouteData.DataTokens["area"].ToString())) 
      { 
       controllerName = string.Format("{0}/{1}", requestContext.RouteData.DataTokens["area"], controllerName); 
      } 

      controllerName = controllerName.ToLower(); 

      return _container.Resolve<IController>(controllerName); 
     } 
     catch (Exception ex) 
     { 
      if (ex is ResolutionFailedException) 
      { 
       IMyLogger logger = _container.Resolve<IMyLogger>(); 
       logger.Error(LogEventIdType.General, ex, "Is the '{0}' controller defined in the Unity Container via RegisterType (in lowercase) in UnityIocBootstrapConfigure?", new object[] {controllerName}); 
       throw; 
      }    
     } 

記錄器記錄到Windows事件日誌。

+0

Hm,'XmlConfigurator'好像是一個log4net的東西。你在使用log4net嗎?我認爲那是你的罪魁禍首,而不是Unity。 – vcsjones

+0

是的,那是我一直在尋找的地方。我們正在使用log4net,並且它正在記錄到一個文件,所以我認爲這是罪魁禍首,但即使在文件appender被註釋掉的情況下,這些調用仍然存在。 – sydneyos

+0

@vcsjones - 你是對的 - log4net配置了自己的配置文件(vs web.config中的config),所以它正在監視那個文件的變化。如果你可以發表你的評論作爲答案,我可以給你信用 - 謝謝! – sydneyos

回答

1

您的跟蹤指向XmlConfigurator,它是log4net。 log4net將其配置存儲在與web.config不同的文件中,因此它會啓動File System Watcher以檢查文件是否已更改以重新配置自身。

看來,性能問題的罪魁禍首是log4net,而不是Unity。

1

統一本身並沒有這樣的事情。實際上,堆棧跟蹤根本不在Unity代碼中,它在控制器工廠內部。

無論誰寫了添加文件系統觀察者。自ASP以來,這很愚蠢。 NET已經監視web.config並重新啓動appdomain,如果它發生變化。

+0

我已經添加了控制器工廠的CreateController代碼。此課程中沒有文件系統監視器。 – sydneyos