1

これらのプロパティは、静的ヘルパー クラスで作成しました。

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];

(デッドロックのように見えますが、私の側からのロックはありません)

4

1 に答える 1

2

ServerManagerクラスは次のように文書化されています

「どのインスタンス メンバーも、スレッド セーフであることが保証されていません」。

これは通常、IIS がメイン スレッドで同時にデータにアクセスしないようにするためにロックを行う方法がないため、バックグラウンド スレッドからそれらを呼び出すことができないことを意味します。

メイン スレッドで必要なものを取得し、キャッシュしてから、バックグラウンド スレッドで使用するだけです。

于 2013-04-02T13:33:31.553 に答える