ServerManager在多个线程中的行为不同

时间:2013-04-02 11:46:28

标签: c# iis servermanager

我在静态助手类中创建了这些属性。

private static ServerManager IISServerManager
    {
        get
        {
            if (mIISServerManager== null)
            {
                mIISServerManager= new ServerManager();
            }

            return mIISServerManager;
        }
     }


private static SiteCollection Sites
    {
        get
        {
            try
            {
                return IISServerManager.Sites;
            }
            catch (Exception)
            {
                return null;
            }
        }
    }

当我调用Helper方法时

 public static bool VirtualDirectoryExists(string dirName, string siteName)
    {
        if (!String.IsNullOrEmpty(dirName) && (Sites != null))
        {
            Site site = Sites[siteName];
            ...

在使用此帮助程序的代码中(在主线程中),它正确检索所有网站及其属性。

另一方面,当我在使用此帮助程序的代码中调用它时(在后台工作程序线程中)检索SitesCollection,但代码在使用索引器[siteName]获取网站时冻结

Site site = Sites[siteName];

(它看起来像死锁,但我身边没有锁定)

1 个答案:

答案 0 :(得分:2)

ServerManager类记录为

  

“不保证任何实例成员都是线程安全的”。

这通常意味着您无法从后台线程调用它们,因为无法进行任何锁定以确保IIS不会在主线程中同时访问数据。

只需在主线程中获取所需内容,将其缓存,然后在后台线程中使用它。